GithubHelp home page GithubHelp logo

skydoves / flexiblebottomsheet Goto Github PK

View Code? Open in Web Editor NEW
753.0 4.0 35.0 19.23 MB

🐬 Advanced Compose Multiplatform bottom sheet for segmented sizing, non-modal type, and allows interaction behind the bottom sheet similar to Google Maps.

License: Apache License 2.0

Kotlin 100.00%
android animation bottomsheet jetpack-compose modal modal-bottom-sheets skydoves

flexiblebottomsheet's Introduction

Google Developer Expert Google Developers Medium Speaker
Sponsors Twitter Mastodon YouTube Profile

GitHub Status

flexiblebottomsheet's People

Contributors

hgarciaalberto avatar ignatberesnev avatar limsaehyun avatar sevbanbayir avatar skydoves avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

flexiblebottomsheet's Issues

Scrim flickers when bottom sheet is dragged fast (user gesture)

Please complete the following information:

  • v0.1.5
  • Any device/emulator

Describe the Bug:
isModal = true
When you do the drag down gesture and throw fast downside the scrim colour will flickers momentary. This doesn't happen when the gesture is done slowly/programatically.

Expected Behaviour:

No flicker

Is it possible to customize the Drag Handle?

Is your feature request related to a problem?
I want to customize the Drag Handle View. Is it possible?
For example: if expand is less than Intermediately, will be the Arrow Up icon. Otherwise, would be Arrow Down icon.

image

[NestedScroll] BottomSheet doesn't hide/dismiss when dragging/flinging via the nested scroll area

  • Library Version [0.1.1]
  • Affected Device(s) [Samsung Galaxy A13 with Android 13.0]

I have made the bottom sheet to just fully expand for my needed case.

flexibleSheetSize = FlexibleSheetSize(
                    fullyExpanded = fullyExpandedRatio,
                    intermediatelyExpanded = 0f,
                    slightlyExpanded = 0f,
 ),
 FlexibleSheetState(
                flexibleSheetSize = flexibleSheetSize,
                isModal = false,
                skipSlightlyExpanded = true,
                skipIntermediatelyExpanded = true,
                containSystemBars = true,
                allowNestedScroll = true,
                animateSpec = SwipeableV2Defaults.AnimationSpec,
)

When I use a scrollable composable like a LazyColumn or a vertically scrollable Column, with allowNestedScroll = true, I can drag/fling the bottom sheet down to try dismiss it but it doesn't hide it. I more exact words, let's say I'm dragging/flinging it down, when I release the finger the sheet goes right back up to fullyExpanded automatically. I don't have this problem when I don't use a scrollable component. I can't share any images/videos due to the project I'm working on.

can i set isModal?

I want to modify the current value of isModal based on the folded state. It seems that this value can only be set when creating a sheetState for the first time. When user interaction is allowed behind the folded page, the current shadow effect will be cancelled. I hope to only allow user operation during the first layer of folding, and maintain shadows and not allow user operation during the subsequent two folds. Can this be achieved. (I am a beginner and this is a mechanical translation. I hope you can understand what I mean.)

When the bottom sheet is expanded, the issue of the navigation bar on the underlying screen being visible

Please complete the following information:

  • Library Version
    current latest version(0.1.2)

  • Affected Device(s) [e.g. Samsung Galaxy s10 with Android 9.0]

  • Galaxy zflip4 and also Pixel5(emulator)

Describe the Bug:
image

When I expand the bottomSheet, there is a problem that can see the behind NavigationBar at the bottom.

code

package com.unifest.android.core.ui.component

import androidx.annotation.StringRes
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text2.input.TextFieldState
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.VerticalDivider
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.skydoves.flexible.bottomsheet.material3.FlexibleBottomSheet
import com.skydoves.flexible.core.FlexibleSheetSize
import com.skydoves.flexible.core.rememberFlexibleBottomSheetState
import com.unifest.android.core.designsystem.ComponentPreview
import com.unifest.android.core.designsystem.R
import com.unifest.android.core.designsystem.component.FestivalSearchTextField
import com.unifest.android.core.designsystem.component.InterestedFestivalDeleteDialog
import com.unifest.android.core.designsystem.theme.Content3
import com.unifest.android.core.designsystem.theme.UnifestTheme
import com.unifest.android.core.domain.entity.Festival
import kotlinx.coroutines.launch

@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)
@Composable
fun FestivalSearchBottomSheet(
    @StringRes searchTextHintRes: Int,
    setFestivalSearchBottomSheetVisible: (Boolean) -> Unit,
    interestedFestivals: MutableList<Festival>,
    initSearchText: () -> Unit,
    setEnableSearchMode: () -> Unit,
    isSearchMode: Boolean,
    setEnableEditMode: () -> Unit,
    isInterestedFestivalDeleteDialogVisible: Boolean,
    setInterestedFestivalDeleteDialogVisible: (Boolean) -> Unit,
    isEditMode: Boolean = false,
) {
    val selectedFestivals = remember { mutableStateListOf<Festival>() }
    val bottomSheetState = rememberFlexibleBottomSheetState(
        containSystemBars = true,
        flexibleSheetSize = FlexibleSheetSize(),
        isModal = true,
        skipSlightlyExpanded = false,
    )
    FlexibleBottomSheet(
        onDismissRequest = {
            setFestivalSearchBottomSheetVisible(false)
        },
        sheetState = bottomSheetState,
        containerColor = Color.White,
        dragHandle = {
            Column(
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(top = 10.dp),
                horizontalAlignment = Alignment.CenterHorizontally,
            ) {
                VerticalDivider(
                    modifier = Modifier
                        .width(80.dp)
                        .height(5.dp)
                        .clip(RoundedCornerShape(43.dp))
                        .background(Color(0xFFA0A0A0)),
                )
            }
        },
    ) {
        Box {
            Column(
                modifier = Modifier
                    .fillMaxSize()
                    .background(Color.White)
                    .padding(
                        bottom = WindowInsets.navigationBars
                            .asPaddingValues()
                            .calculateBottomPadding(),
                    ),
            ) {
                Spacer(modifier = Modifier.height(24.dp))
                FestivalSearchTextField(
                    searchText = TextFieldState(),
                    searchTextHintRes = searchTextHintRes,
                    onSearch = {},
                    initSearchText = initSearchText,
                    setEnableSearchMode = setEnableSearchMode,
                    isSearchMode = isSearchMode,
                    modifier = Modifier
                        .height(46.dp)
                        .fillMaxWidth()
                        .padding(horizontal = 20.dp),
                )
                if (!isSearchMode) {
                    Spacer(modifier = Modifier.height(39.dp))
                    VerticalDivider(
                        modifier = Modifier
                            .fillMaxWidth()
                            .height(8.dp)
                            .background(Color(0xFFF1F3F7)),
                    )
                    Spacer(modifier = Modifier.height(21.dp))
                    InterestedFestivalsGrid(
                        selectedFestivals = interestedFestivals,
                        onFestivalSelected = { school ->
                            selectedFestivals.remove(school)
                        },
                        isEditMode = isEditMode,
                        setInterestedFestivalDeleteDialogVisible = setInterestedFestivalDeleteDialogVisible,
                    ) {
                        TextButton(
                            onClick = setEnableEditMode,
                        ) {
                            Text(
                                text = stringResource(id = R.string.edit),
                                color = Color.Black,
                                style = Content3,
                            )
                        }
                    }
                }
            }
            if (isInterestedFestivalDeleteDialogVisible) {
                InterestedFestivalDeleteDialog(
                    onCancelClick = {
                        setInterestedFestivalDeleteDialogVisible(false)
                    },
                    onConfirmClick = {
                        setInterestedFestivalDeleteDialogVisible(false)
                    },
                )
            }
        }
    }
}

@ComponentPreview
@Composable
fun SchoolSearchBottomSheetPreview() {
    UnifestTheme {
        FestivalSearchBottomSheet(
            searchTextHintRes = R.string.festival_search_text_field_hint,
            setFestivalSearchBottomSheetVisible = {},
            interestedFestivals = mutableListOf(
                Festival("https://picsum.photos/36", "서울대학교", "설대축제", "05.06-05.08"),
                Festival("https://picsum.photos/36", "연세대학교", "연대축제", "05.06-05.08"),
                Festival("https://picsum.photos/36", "고려대학교", "고대축제", "05.06-05.08"),
                Festival("https://picsum.photos/36", "건국대학교", "녹색지대", "05.06-05.08"),
                Festival("https://picsum.photos/36", "성균관대학교", "성대축제", "05.06-05.08"),
            ),
            initSearchText = {},
            setEnableSearchMode = {},
            isSearchMode = false,
            setEnableEditMode = {},
            isInterestedFestivalDeleteDialogVisible = false,
            isEditMode = false,
            setInterestedFestivalDeleteDialogVisible = {},
        )
    }
}

The above problem also occurred even when the bottomPadding value related to WindowInsets was removed

Expected Behavior:
Even when the bottomSheet is extended, the Navigation Bar located behind the screen should not be visible.

Initial state not working and not able to be set.

  • Library Version : com.github.skydoves:flexible-bottomsheet-material3:0.1.2
  • Affected Device(s) : Pixel 8 Pro SDK 34

Initial state not working or not able to be set.

Tracing the library code, calling rememberFlexibleBottomSheetState calls a private function rememberFlexibleSheetState which has a default parameter of initialValue: FlexibleSheetValue = FlexibleSheetValue.Hidden. The public method does not take that parameter, however, the initial state should evaluate to hidden regardless.

In my most basic implementation, the sheet always starts off a not hidden, intermediately expanded.

 val sheetState = rememberFlexibleBottomSheetState(
      isModal = false
 )

FlexibleBottomSheet(
        windowInsets = WindowInsets(0, 0, 0, 0),
        onDismissRequest = { },
        sheetState = sheetState,
      ) {
        CircularProgressIndicator()
      }
}

It's not clear how to set the initial state, or if it's supported. Am I missing something obvious?

Wrapping the entire FlexibleBottomSheet in an if statement and check some state before showing works, but then it gets awkward to have a nice animation to hide it when that state changes, it would just abruptly disappear.

Expected Behaviour:

  • there is a way to set the initial state value
  • initial state value is respected.

BackHandler doesn't work if bottom sheet active

Please complete the following information:

  • Library Version: v0.1.5
  • Affected Device(s) : Any

Describe the Bug:
Adding BackHandler onBack callback doesn't get called if BackHandler is added and the bottom sheet in visible.

Expected Behavior:
To control the back navigation manually I would expect that BackHandler to work in combination to the FlexibleBottomSheet.

Notes:
I noticed looking at the source code that FlexibleBottomSheetPopup controls the BackHandle behaviour and that it will force you to go to sheetState.intermediatelyExpand() if current is FullyExpanded. What if we want to make it close completely instead?

Allow passing the initial value for FlexibleSheetValue

Is your feature request related to a problem?

Currently the function that allows settings it is hidden as a internal.

Describe the solution you'd like:

Add an extra paramter initialValue : FlexibleSheetValue to the public rememberFlexibleBottomSheetState

Describe alternatives you've considered:

Doing myself the function + remember + saver

Bottom Sheet visibility bug when dismissing

Please complete the following information:

  • Library Version [e.g. v1.0.0] : latest commit 1c0e68f
  • Affected Device(s) [e.g. Samsung Galaxy s10 with Android 9.0]
    OppoCPH1803 , Samsung A510F, Iphone
    Describe the Bug:

Add a clear description about the problem.
When dismissing the sheet using a drag gesture, the bottom sheet disappears for a split second then just before completely hiding it reappears again and hides fully. Also, in this state of the sheet "disappearing" if I drag the sheet up instead of down it reappears again.
Expected Behavior:

A clear description of what you expected to happen.

The sheet should always be visible on screen as long as I'm dragging it and it should only fully disappear when I fully drag it downwards.

Keyboard not displayed

Please complete the following information:

  • Library Version : v0.1.2
  • Affected Device(s) : Pixel

Describe the Bug:

I've added a text field to the content of the bottom flexible sheet.
When clicked, the keyboard is not displayed.

is it possible to show the keyboard below the text field in the bottom sheet ?

Implementing Bottom Sheet Scrim Display Upon Expansion

Is your feature request related to a problem?

When we pull down the bottom sheet and hold it, even though the bottom sheet exists, it is possible to click behind it and navigate to another page, and then reopen the bottom sheet again, even if it is a modal bottom sheet.

Describe the solution you'd like:

Describe alternatives you've considered:

Popup Placement is Inconsistent in FlexibleBottomSheet

Tested on API 30 (Samsung S23) and API 34 (Pixel 7a).

In my FlexibleBottomSheet, I am showing a Popup (in my example code the Popup/tooltip can be shown when holding/pressing on the button).

1.
When isModal is set to false, the tooltip does not remain in place consistently in all of its "expanded/slightly-expanded" layouts:
isModalFalse0

After sliding the bottom sheet: (Notice the offset between the button)
isModalFalse1

2.
When isModal is set to true, and comparing to Material 3's ModalBottomSheet and BottomSheetScaffold, the Popup has an unexpected offset (the offset is not happening in the Material 3's ModalBottomSheet and BottomSheetScaffold).

Flexible Bottom Sheet (isModal = true):
isModalTrue0

Material 3 BottomSheetScaffold:
bottomsheetScaffold0

Material 3 ModalBottomSheet:
modalBottomSheet0

Here is my relavant code:

import androidx.compose.foundation.interaction.HoverInteraction
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.PressInteraction
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.BottomSheetScaffold
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Popup
import androidx.compose.ui.window.PopupPositionProvider
import com.skydoves.flexible.bottomsheet.material3.FlexibleBottomSheet
import com.skydoves.flexible.core.FlexibleSheetSize
import com.skydoves.flexible.core.rememberFlexibleBottomSheetState

@Preview
@Composable
fun FlexibleBottomSheetExample() {
    val sheetSize = FlexibleSheetSize(
        fullyExpanded = 1f,
        intermediatelyExpanded = 0.5f,
        slightlyExpanded = 0.10f,
    )
    val sheetState  = rememberFlexibleBottomSheetState(
        flexibleSheetSize = sheetSize,
        containSystemBars = false,
        isModal = true,
        skipSlightlyExpanded = true,
        confirmValueChange = { true }
    )
    FlexibleBottomSheet(
        onDismissRequest = {},
        sheetState = sheetState,
        content = {
            LazyColumn {
                item {
                    Spacer(modifier = Modifier.height(24.dp))
                    ButtonWithTooltip()
                    Spacer(modifier = Modifier.height(64.dp))
                }
            }
        }
    )
}

@OptIn(ExperimentalMaterial3Api::class)
@Preview
@Composable
fun BottomSheetScaffoldExample() {
    BottomSheetScaffold(
        sheetContent = {
            Spacer(modifier = Modifier.height(24.dp))
            ButtonWithTooltip()
            Spacer(modifier = Modifier.height(64.dp))
        },
        sheetPeekHeight = 140.dp
    ) {
    }
}

@OptIn(ExperimentalMaterial3Api::class)
@Preview
@Composable
fun ModalBottomSheetExample() {
    ModalBottomSheet(
        onDismissRequest = {},
        content = {
            Spacer(modifier = Modifier.height(24.dp))
            ButtonWithTooltip()
            Spacer(modifier = Modifier.height(64.dp))
        },
    )
}

@Composable
fun ButtonWithTooltip() {
    var showTooltip by remember { mutableStateOf(false) }
    val interactionSource = remember { MutableInteractionSource() }

    LaunchedEffect(interactionSource) {
        interactionSource.interactions.collect { interaction ->
            when (interaction) {
                is PressInteraction.Press -> showTooltip = true
                is PressInteraction.Release,
                is PressInteraction.Cancel -> showTooltip = false
                is HoverInteraction.Enter -> showTooltip = true
                is HoverInteraction.Exit -> showTooltip = false
            }
        }
    }
    Box {
        Button(
            onClick = { },
            interactionSource = interactionSource
        ) {
            Text(text = "Button")
        }
        if (showTooltip) {
            Popup(
                popupPositionProvider = object : PopupPositionProvider {
                    override fun calculatePosition(
                        anchorBounds: IntRect,
                        windowSize: IntSize,
                        layoutDirection: LayoutDirection,
                        popupContentSize: IntSize
                    ): IntOffset {
                        val x = anchorBounds.left
                        val y = anchorBounds.top - popupContentSize.height
                        return IntOffset(x, y)
                    }
                }
            ) {
                Surface(
                    shape = RoundedCornerShape(4.dp),
                    color = if (isSystemInDarkTheme()) Color.White else Color.Black,
                ) {
                    Text(
                        text = "Tooltip",
                        color = if (isSystemInDarkTheme()) Color.Black else Color.White,
                        modifier = Modifier.padding(8.dp)
                    )
                }
            }
        }
    }
}

Sticky view at the bottom of bottom sheet

Please complete the following information:

  • Library Version 0.1.3

Describe the Bug:
Im trying to show a sticky view at bottom of bottom sheet by wrapping the sheet composable and the view within a column but it doesnt seem to work

 Column {
                    FlexibleBottomSheet()
                    Button()    
}

This causes effect of similar to wrapping the children in a Box composable instead, but the sheet is on top always irrespective of order because it actually adds window on top of views in android.

How can this be implemented correctly? @skydoves

Example:
giphy-ezgif com-webp-to-gif-converter

BottomSheet not fully hidden

  • Library Version [0.1.1]
  • Affected Device(s) [Samsung Galaxy a13 with Android 13.0]

Bottom Sheet is slightly visible at the bottom when it's hidden. You can see the WHITE line at the end of the photo

FlexibleBottomSheet(
        sheetState = sheetState,
        windowInsets = WindowInsets.waterfall,
        tonalElevation = 0.dp,
        shape = RectangleShape,
        onDismissRequest = {
            //NOOP
        },
        containerColor = White,
)
FlexibleSheetState(
                flexibleSheetSize = FlexibleSheetSize(fullyExpanded = fullyExpandedRatio),
                isModal = false,
                skipSlightlyExpanded = true,
                skipIntermediatelyExpanded = true,
                containSystemBars = true,
                allowNestedScroll = true,
                animateSpec = SwipeableV2Defaults.AnimationSpec,
)

FlexibleBottomSheet

FlexibleSheetSize iOS -> java.lang.IllegalStateException

Hi,

I tried the basic implementation from your documentation, it works perfectly fine on Android, but I have an issue on iOS when I set the flexibleSheetSize (see stacktrace below).
However, when I remove the FlexibleSheetSize block, the program is able to run.

At first I was using Xcode 15.2, then I upgraded to 15.4 but the error occurs with both versions.

I'm using :

  • jvmTarget : 17
  • kotlin : 2.0.0
  • FlexibleBottomSheet : 0.1.4 (problem also occurs on 0.1.3)

Did I forgot something or is this a bug from the library ?

My code is the same as the one from the readme :

FlexibleBottomSheet(
  onDismissRequest = onDismissRequest,
  sheetState = rememberFlexibleBottomSheetState(
    flexibleSheetSize = FlexibleSheetSize(
      fullyExpanded = 0.9f,
      intermediatelyExpanded = 0.5f,
      slightlyExpanded = 0.15f,
    ),
    isModal = true,
    skipSlightlyExpanded = false,
  ),
  containerColor = Color.Black,
) {
  Text(
    modifier = Modifier
      .fillMaxWidth()
      .padding(8.dp),
    text = "This is Flexible Bottom Sheet",
    textAlign = TextAlign.Center,
    color = Color.White,
  )
}
Compilation failed: Exception during generating code for following declaration:

@Composable

@HiddenFromObjC

fun CustomBottomSheet(onDismissRequest: Function0<Unit>, /* var */ $composer: Composer?, $changed: Int) {

  var $composer: Composer? = $composer

  $composer = $composer.startRestartGroup(key = 1420873155)

  var $dirty: Int = $changed

  when {

    areEqualByValue(first = $changed.and(other = 14).reinterpret<Int, Int>(), second = 0.reinterpret<Int, Int>()) -> $dirty = $dirty.or(other = when {

      $composer.changedInstance(value = onDismissRequest) -> 4

      true -> 2

    })

  }

  when {

    when {

      areEqualByValue(first = $dirty.and(other = 11).reinterpret<Int, Int>(), second = 2.reinterpret<Int, Int>()).not() -> true

      true -> $composer.<get-skipping>().not()

    } -> { // BLOCK

      FlexibleBottomSheet(onDismissRequest = onDismissRequest, modifier = // COMPOSITE {

      null

      // }, sheetState = { // BLOCK

        val tmp66_flexibleSheetSize: FlexibleSheetSize = FlexibleSheetSize(fullyExpanded = 0.9F, intermediatelyExpanded = // COMPOSITE {

        0.0F.reinterpret<Float, Float>()

        // }, slightlyExpanded = // COMPOSITE {

        0.0F.reinterpret<Float, Float>()

        // }, $mask0 = 6, $marker = null)

        rememberFlexibleBottomSheetState(skipHiddenState = // COMPOSITE {

        false

        // }, skipIntermediatelyExpanded = // COMPOSITE {

        false

        // }, skipSlightlyExpanded = false, isModal = true, containSystemBars = // COMPOSITE {

        false

        // }, allowNestedScroll = // COMPOSITE {

        false

        // }, animateSpec = // COMPOSITE {

        null

        // }, flexibleSheetSize = tmp66_flexibleSheetSize, confirmValueChange = // COMPOSITE {

        null

        // }, $composer = $composer, $changed = 3456.or(other = #com_skydoves_flexible_core_FlexibleSheetSize$stable.shl(bitCount = 21)), $default = 371)

      }, onTargetChanges = // COMPOSITE {

      null

      // }, shape = // COMPOSITE {

      null

      // }, containerColor = <get-$companion>().<get-Black>(), contentColor = // COMPOSITE {

      { // BLOCK

        val tmp1: ULong = { // BLOCK

          val tmp0: Long = 0L

          <constructor>(data = tmp0)

          tmp0

        }

        <constructor>(value = tmp1)

        tmp1

      }

      // }, scrimColor = // COMPOSITE {

      { // BLOCK

        val tmp3: ULong = { // BLOCK

          val tmp2: Long = 0L

          <constructor>(data = tmp2)

          tmp2

        }

        <constructor>(value = tmp3)

        tmp3

      }

      // }, dragHandle = // COMPOSITE {

      null

      // }, windowInsets = // COMPOSITE {

      null

      // }, content = <get-$instance>().<get-lambda-7>(), $composer = $composer, $changed = 196608.or(other = 14.and(other = $dirty)), $changed1 = 6, $default = 986)

    }

    true -> $composer.skipToGroupEnd()

  }

  { // BLOCK

    { // BLOCK

      val tmp0_safe_receiver: ScopeUpdateScope? = $composer.endRestartGroup()

      when {

        EQEQEQ(arg0 = tmp0_safe_receiver.reinterpret<ScopeUpdateScope?, Any?>(), arg1 = null) -> null

        true -> tmp0_safe_receiver.updateScope(block = { // BLOCK

          // COMPOSITE {

          // }

          $CustomBottomSheet$lambda$36$FUNCTION_REFERENCE$11($onDismissRequest = onDismissRequest, $$changed = $changed)

        })

      }

    }

  }

  return theUnitInstance()

}
	at org.jetbrains.kotlin.backend.konan.llvm.NativeCodeGeneratorException$Companion.wrap(IrToBitcode.kt:65)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor$FileScope.wrapException(IrToBitcode.kt:2148)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor$FileScope.wrapException(IrToBitcode.kt:2131)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitFile(IrToBitcode.kt:3351)
	at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitFile(IrElementVisitorVoid.kt:180)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitFile(IrToBitcode.kt:244)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitFile(IrToBitcode.kt:244)
	at org.jetbrains.kotlin.ir.declarations.IrFile.accept(IrFile.kt:28)
	at org.jetbrains.kotlin.ir.declarations.IrModuleFragment.acceptChildren(IrModuleFragment.kt:39)
	at org.jetbrains.kotlin.ir.visitors.IrVisitorsKt.acceptChildrenVoid(IrVisitors.kt:15)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitModuleFragment(IrToBitcode.kt:475)
	at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitModuleFragment(IrElementVisitorVoid.kt:116)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitModuleFragment(IrToBitcode.kt:244)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitModuleFragment(IrToBitcode.kt:244)
	at org.jetbrains.kotlin.ir.declarations.IrModuleFragment.accept(IrModuleFragment.kt:33)
	at org.jetbrains.kotlin.ir.visitors.IrVisitorsKt.acceptVoid(IrVisitors.kt:11)
	at org.jetbrains.kotlin.backend.konan.driver.phases.BitcodeGenerationKt.CodegenPhase$lambda$2(BitcodeGeneration.kt:76)
	at org.jetbrains.kotlin.backend.common.phaser.PhaseBuildersKt$createSimpleNamedCompilerPhase$3.phaseBody(PhaseBuilders.kt:93)
	at org.jetbrains.kotlin.backend.common.phaser.PhaseBuildersKt$createSimpleNamedCompilerPhase$3.phaseBody(PhaseBuilders.kt:81)
	at org.jetbrains.kotlin.backend.common.phaser.SimpleNamedCompilerPhase.phaseBody(CompilerPhase.kt:226)
	at org.jetbrains.kotlin.backend.common.phaser.AbstractNamedCompilerPhase.invoke(CompilerPhase.kt:113)
	at org.jetbrains.kotlin.backend.konan.driver.PhaseEngine.runPhase(Machinery.kt:139)
	at org.jetbrains.kotlin.backend.konan.driver.PhaseEngine.runPhase$default(Machinery.kt:130)
	at org.jetbrains.kotlin.backend.konan.driver.phases.TopLevelPhasesKt.runCodegen(TopLevelPhases.kt:386)
	at org.jetbrains.kotlin.backend.konan.driver.phases.TopLevelPhasesKt.runBackendCodegen(TopLevelPhases.kt:329)
	at org.jetbrains.kotlin.backend.konan.driver.phases.TopLevelPhasesKt.compileModule(TopLevelPhases.kt:261)
	at org.jetbrains.kotlin.backend.konan.driver.phases.TopLevelPhasesKt.runBackend$lambda$11$runAfterLowerings(TopLevelPhases.kt:114)
	at org.jetbrains.kotlin.backend.konan.driver.phases.TopLevelPhasesKt.runBackend(TopLevelPhases.kt:139)
	at org.jetbrains.kotlin.backend.konan.driver.DynamicCompilerDriver.produceObjCFramework(DynamicCompilerDriver.kt:76)
	at org.jetbrains.kotlin.backend.konan.driver.DynamicCompilerDriver.run$lambda$2$lambda$1$lambda$0(DynamicCompilerDriver.kt:42)
	at org.jetbrains.kotlin.backend.konan.driver.PhaseEngine$Companion$startTopLevel$topLevelPhase$1.phaseBody(Machinery.kt:98)
	at org.jetbrains.kotlin.backend.konan.driver.PhaseEngine$Companion$startTopLevel$topLevelPhase$1.phaseBody(Machinery.kt:92)
	at org.jetbrains.kotlin.backend.common.phaser.SimpleNamedCompilerPhase.phaseBody(CompilerPhase.kt:226)
	at org.jetbrains.kotlin.backend.common.phaser.AbstractNamedCompilerPhase.invoke(CompilerPhase.kt:113)
	at org.jetbrains.kotlin.backend.konan.driver.PhaseEngine$Companion.startTopLevel(Machinery.kt:105)
	at org.jetbrains.kotlin.backend.konan.driver.DynamicCompilerDriver.run(DynamicCompilerDriver.kt:36)
	at org.jetbrains.kotlin.backend.konan.KonanDriver.run(KonanDriver.kt:129)
	at org.jetbrains.kotlin.cli.bc.K2Native.runKonanDriver(K2Native.kt:152)
	at org.jetbrains.kotlin.cli.bc.K2Native.doExecute(K2Native.kt:69)
	at org.jetbrains.kotlin.cli.bc.K2Native.doExecute(K2Native.kt:36)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:104)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:48)
	at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101)
	at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:79)
	at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:43)
	at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMainNoExit(CLITool.kt:180)
	at org.jetbrains.kotlin.cli.bc.K2Native$Companion.mainNoExitWithRenderer$lambda$2(K2Native.kt:189)
	at org.jetbrains.kotlin.util.UtilKt.profileIf(Util.kt:22)
	at org.jetbrains.kotlin.util.UtilKt.profile(Util.kt:16)
	at org.jetbrains.kotlin.cli.bc.K2Native$Companion.mainNoExitWithRenderer(K2Native.kt:188)
	at org.jetbrains.kotlin.cli.bc.K2NativeKt.mainNoExitWithXcodeRenderer(K2Native.kt:207)
	at org.jetbrains.kotlin.cli.utilities.MainKt$daemonMainWithXcodeRenderer$1.invoke(main.kt:52)
	at org.jetbrains.kotlin.cli.utilities.MainKt$daemonMainWithXcodeRenderer$1.invoke(main.kt:52)
	at org.jetbrains.kotlin.cli.utilities.MainKt.mainImpl(main.kt:20)
	at org.jetbrains.kotlin.cli.utilities.MainKt.inProcessMain(main.kt:57)
	at org.jetbrains.kotlin.cli.utilities.MainKt.daemonMainWithXcodeRenderer(main.kt:52)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.jetbrains.kotlin.compilerRunner.KotlinToolRunner.runInProcess(KotlinToolRunner.kt:208)
	at org.jetbrains.kotlin.compilerRunner.KotlinToolRunner.run(KotlinToolRunner.kt:142)
	at org.jetbrains.kotlin.compilerRunner.KotlinNativeToolRunner.run(nativeToolRunners.kt:153)
	at org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink$compile$1.invoke(KotlinNativeLink.kt:452)
	at org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink$compile$1.invoke(KotlinNativeLink.kt:400)
	at org.jetbrains.kotlin.compilerRunner.ReportUtilsKt.addBuildMetricsForTaskAction(reportUtils.kt:261)
	at org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink.compile(KotlinNativeLink.kt:400)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
	at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:244)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:229)
	at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:212)
	at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:195)
	at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:162)
	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)
	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)
	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)
	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)
	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)
	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)
	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)
	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67)
	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37)
	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)
	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)
	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:67)
	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:45)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40)
	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29)
	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)
	at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
	at org.gradle.internal.Either$Right.fold(Either.java:175)
	at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)
	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)
	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:76)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:54)
	at java.base/java.util.Optional.orElseGet(Optional.java:364)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)
	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)
	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)
	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)
	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65)
	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36)
	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:106)
	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:55)
	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:64)
	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:43)
	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:125)
	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:61)
	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:36)
	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)
	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)
	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)
	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)
	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)
	at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:289)
	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)
	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)
	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)
	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)
	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)
	at java.base/java.util.Optional.orElseGet(Optional.java:364)
	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)
	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)
	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)
	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)
	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:48)
	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35)
	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:61)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:127)
	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116)
	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)
	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)
	at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:80)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)
	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)
	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)

Caused by: java.lang.IllegalStateException: FIELD name:com_skydoves_flexible_core_FlexibleSheetSize$stable type:kotlin.Int visibility:public [final,static]
	at org.jetbrains.kotlin.backend.konan.llvm.LlvmDeclarations.forStaticField(LlvmDeclarations.kt:53)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.staticFieldPtr(IrToBitcode.kt:1871)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateGetField(IrToBitcode.kt:1767)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression(IrToBitcode.kt:983)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression$default(IrToBitcode.kt:971)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExplicitArgs(IrToBitcode.kt:2366)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateCall(IrToBitcode.kt:2237)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression(IrToBitcode.kt:975)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression$default(IrToBitcode.kt:971)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExplicitArgs(IrToBitcode.kt:2366)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateCall(IrToBitcode.kt:2237)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression(IrToBitcode.kt:975)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression$default(IrToBitcode.kt:971)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExplicitArgs(IrToBitcode.kt:2366)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateCall(IrToBitcode.kt:2237)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression(IrToBitcode.kt:975)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateContainerExpression(IrToBitcode.kt:2215)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression(IrToBitcode.kt:991)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression$default(IrToBitcode.kt:971)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExplicitArgs(IrToBitcode.kt:2366)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateCall(IrToBitcode.kt:2237)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression(IrToBitcode.kt:975)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateContainerExpression(IrToBitcode.kt:2215)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression(IrToBitcode.kt:991)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.generateWhenCase(IrToBitcode.kt:1346)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateWhen(IrToBitcode.kt:1314)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression(IrToBitcode.kt:987)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.evaluateExpression$default(IrToBitcode.kt:971)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.generateStatement(IrToBitcode.kt:1012)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.generateStatement$default(IrToBitcode.kt:1010)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitFunction(IrToBitcode.kt:888)
	at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitSimpleFunction(IrElementVisitorVoid.kt:144)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitSimpleFunction(IrToBitcode.kt:244)
	at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitSimpleFunction(IrElementVisitorVoid.kt:140)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitSimpleFunction(IrToBitcode.kt:244)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitSimpleFunction(IrToBitcode.kt:244)
	at org.jetbrains.kotlin.ir.declarations.IrSimpleFunction.accept(IrSimpleFunction.kt:36)
	at org.jetbrains.kotlin.ir.declarations.IrFile.acceptChildren(IrFile.kt:34)
	at org.jetbrains.kotlin.ir.visitors.IrVisitorsKt.acceptChildrenVoid(IrVisitors.kt:15)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitFile$lambda$41$lambda$40(IrToBitcode.kt:606)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.runAndProcessInitializers(IrToBitcode.kt:455)
	at org.jetbrains.kotlin.backend.konan.llvm.CodeGeneratorVisitor.visitFile(IrToBitcode.kt:605)
	... 192 more

org.jetbrains.kotlin.backend.konan.llvm.NativeCodeGeneratorException: Exception during generating code for following declaration:

FAILURE: Build failed with an exception.


* What went wrong:

Execution failed for task ':composeApp:linkDebugFrameworkIosSimulatorArm64'.

> Compilation finished with errors


* Try:

> Run with --stacktrace option to get the stack trace.

> Run with --info or --debug option to get more log output.

> Run with --scan to get full insights.

> Get more help at https://help.gradle.org.


Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/8.7/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.


BUILD FAILED in 7s

8 actionable tasks: 3 executed, 5 up-to-date

Compilation finished with errors

Windows insets ignored if isModal = true

Please complete the following information:

  • Library Version: v0.1.5
  • Affected Device(s): all

Describe the Bug:
(when isModal is true)
Even if you set the windowInsets to PaddingValues(0.dp) and containSystemBars = true, the statusBar padding is applied.

Expected Behavior:
window insets are respected. E.g. If no systemBar window insets are added FullyExpanded bottom sheet should overlap top of the screen (edge to edge behaviour)

Note:
The origin of the problem seems to come from:
FlexibleBottomSheet.kt L292

modifier = if (sheetState.isModal) {
            Modifier
              .fillMaxWidth()
              .sheetPaddings(sheetState)
          } else {
            Modifier
              .fillMaxWidth()
          },
public fun Modifier.sheetPaddings(sheetState: FlexibleSheetState): Modifier = composed {
  val systemBarsPadding = WindowInsets.systemBars.asPaddingValues()
  val paddings =
    systemBarsPadding.calculateBottomPadding() + systemBarsPadding.calculateTopPadding()
  val availableHeight = screenHeight() * (1 - sheetState.flexibleSheetSize.fullyExpanded)
  val padding = availableHeight - paddings

  if (sheetState.currentValue == FlexibleSheetValue.FullyExpanded && padding.toPx() > 0) {
    Modifier.padding(bottom = availableHeight - paddings)
  } else {
    this
  }
}

iOS FlexibleSheetSize getting error in KMP Project

  • Library Version [v0.1.3]
  • Kotlin Compose Version [v.1.6.11]
  • Kotlin Version [v2.0.0]

This is my libs.versions.toml implementation

[versions]
bottom-sheet = "0.1.3"

[libraries]
flexible-bottom-sheet = {module = "com.github.skydoves:flexible-bottomsheet-material", version.ref = "bottom-sheet"}
flexible-bottom-sheet3 = {module = "com.github.skydoves:flexible-bottomsheet-material3", version.ref = "bottom-sheet"}

and build.gradle.kts file

    commonMain.dependencies {
        implementation(libs.flexible.bottom.sheet)
        implementation(libs.flexible.bottom.sheet3)
    }

When i added FlexibleSheetSize feature to rememberFlexibleBottomSheetState, iOS Platform getting error. But If i can not use FlexibleSheetSize then iOS app running without any error

Make bottom sheet fullscreen (without Android status bar)

In my app I want the status bar from Android at the top of the screen (where time and battery status are shown) to not be visible.
Unfortunately, I didn't find a working solution to expand to the status bar area in the FullyExpanded sheet state.
Instead, on top of the bottom sheet there is some space (where normally the top bar is placed) and there is no way to close the space and make the bottom sheet to fully expand to the top of the screen.

I already tried:

  • setting containSystemBars in FlexibleSheetState
  • setting WindowInsets in FlexibleBottomSheet (top = 0.dp)

Allow the API user know the "visibility" progress of the bottom sheet.

Is your feature request related to a problem?
I want to use the progress of the visibility to dynamically update some contents

Describe the solution you'd like:

FlexibleSheetState would contain a state property progress : State<Float>.
0f would mean the bottom sheet is Hidden
1f would mean the bottom sheet is FullyExpanded

This progress would update whenever an automatic animation occurs or when the user drags the bottom sheet up or down.

Describe alternatives you've considered:

Manually calculation the bottom sheet visible height. And doing approximated calculations.

Let control back handler

Is your feature request related to a problem?

Currently, back handling is encapsulated inside the library and only changes the sheet expanding state. This makes it impossible to create stateful sheets in which the back handler could be part of navigation between states.

StatusBar dim is not Showing

  • Library Version
    -v0.1.2
  • Affected Device(s)
    • Samsung Galaxy zflip4 with Android 14.0 Pixel5(emulator)

Describe the Bug:
In the case of M3 ModalBottomSheet, Dim processing is possible in the Status Bar area when BottomSheet is on the screen by specifying windowInsets = WindowInsets(top = 0).
But FlexibleBottomSheet not working by by specifying windowInsets = WindowInsets(top = 0).

Add a clear description about the problem.

M3 ModalBottomSheet FlexibleBottomSheet

full code is here.
https://github.com/Project-Unifest/unifest-android/blob/develop/core/ui/src/main/kotlin/com/unifest/android/core/ui/component/FestivalBottomSheet.kt

Expected Behavior:
I hope dim processing is applied to the Status Bar area.

Scrim doesn't contain statusbar

Please complete the following information:

  • Library Version 0.1.0
  • Affected Device(s) Samsung Galaxy s23 with Android 13]

Describe the Bug:
With only Horizontal sides' insets scrim doesn't contain status bar 🧐

windowInsets = BottomSheetDefaults.windowInsets.only(WindowInsetsSides.Horizontal)

Expected Behavior:

A clear description of what you expected to happen.

Adding support for “expand to wrap content” state

Is your feature request related to a problem?
No, not really.

A clear and concise description of what the problem is.

The current implementation does not support expanding until the sheet wraps its content.

Describe the solution you'd like:

It would be great if there was a parameter or extra sheet state that could be specified so that the bottom sheet can expand until it wraps all of its content.

Describe alternatives you've considered:

Although I have not yet tried it myself, this could potentially be achieved using the onGloballyPosition modifier (?).

When restoring the Sheet with rememberSaveable(), the display state of the Sheet is incorrect.

Please complete the following information:

  • Library Version: v0.1.4
  • Affected Device(s) : The built-in Android Studio emulator, API 35

Describe the Bug:

Well, you can look this video from below. On the Android side, click the non modal button, and the sheet will be displayed. When the Sheet is in the fullyExpanded state, switch to the Settings app through the task manager interface, open the Display options, and then turn on or off the Dark mode in the Display interface. After returning to the demo app, the Sheet no longer displays. So click the non modal button again, the Sheet shows up, but because it is reloaded from memory, the display state of the Sheet is not the fullyExpanded state, it's intermediatelyExpanded state, which is not the expected result.

Screen_recording_20240817_233519.mp4

Expected Behavior:

Restore to whatever state it was in before the configuration was changed.

btw,In this case, when the variable SheetState is obtained through rememberSaveable(), the Full state is the initial state value, which leads to the value of hasIntermediatelyExpandedState being true. As a result, the targetStateValue becomes the intermediate state. Therefore, calling the show() method in FlexibleBottomSheet will display the sheet in an intermediate state style. I'm not sure whether it's considered a bug or a feature; in any case, I find this mechanism for restoring the state to be confusing and strange. So, is it or add a configuration variable to implement calling other ShowSheet state methods instead of the default show() method?

Question about the usage of internal APIs in the bottom sheet implementation

This is not a feature request nor a bug report, I was mostly curious about the lines I can see inside here in particular

val className = "android.view.WindowManager\$LayoutParams"
val layoutParamsClass = Class.forName(className)
val privateFlags: Field = layoutParamsClass.getField("privateFlags")
val noAnim: Field = layoutParamsClass.getField("PRIVATE_FLAG_NO_MOVE_ANIMATION")
var privateFlagsValue: Int = privateFlags.getInt(this)
val noAnimFlag: Int = noAnim.getInt(this)
privateFlagsValue = privateFlagsValue or noAnimFlag
privateFlags.setInt(this, privateFlagsValue)

I am only asking because I am concerned about what kind of risks you think one would be opting into while using this. And what are the chances that these private APIs will change in the future in a backwards incompatible way making this not work as expected in future Android API levels. If that were to happen, can the library update the code accordingly to keep all of this working as expected?

Skip Hidden State

현재 카카오 티 앱의 주차 기능에서 처럼 flexible한 bottom sheet + No Hidden State인 BottomSheet 구현을 할 수 있게 skipHiddenState에 대해서 제안드립니다.

@Composable
fun rememberFlexibleBottomSheetState(
    skipIntermediatelyExpanded: Boolean = false,
    skipSlightlyExpanded: Boolean = true,
    skipHiddenState: Boolean = false,
    isModal: Boolean = false,
    containSystemBars: Boolean = false,
    allowNestedScroll: Boolean = true,
    animateSpec: AnimationSpec<Float> = SwipeableV2Defaults.AnimationSpec,
    flexibleSheetSize: FlexibleSheetSize = FlexibleSheetSize(),
    confirmValueChange: (FlexibleSheetValue) -> Boolean = { true },
    initialValue: FlexibleSheetValue = FlexibleSheetValue.IntermediatelyExpanded,
): FlexibleSheetState = rememberFlexibleSheetState(
    skipIntermediatelyExpanded = skipIntermediatelyExpanded,
    skipSlightlyExpanded = skipSlightlyExpanded,
    isModal = isModal,
    animateSpec = animateSpec,
    confirmValueChange = confirmValueChange,
    flexibleSheetSize = flexibleSheetSize,
    containSystemBars = containSystemBars,
    allowNestedScroll = allowNestedScroll,
    initialValue = initialValue,
    skipHiddenState = skipHiddenState,
)

private rememberFlexibleBottomSheetState()의 경우에는 skipHiddenState에 해당하는 파라미터가 있던데 public rememberFlexibleBottomSheetState()의 경우에는 skipHiddenState가 파라미터에 없어 추가를 하였습니다.

fun Modifier.flexibleBottomSheetSwipeable(
    sheetState: FlexibleSheetState,
    flexibleSheetSize: FlexibleSheetSize,
    anchorChangeHandler: AnchorChangeHandler<FlexibleSheetValue>,
    sheetFullHeight: Float,
    sheetConstraintHeight: Float,
    screenMaxHeight: Float,
    isModal: Boolean,
    onDragStarted: suspend CoroutineScope.(startedPosition: Offset) -> Unit = {},
    onDragStopped: CoroutineScope.(velocity: Float) -> Unit,
): Modifier = draggable(
    state = sheetState.swipeableState.swipeDraggableState,
    orientation = Orientation.Vertical,
    enabled = sheetState.isVisible,
    startDragImmediately = sheetState.swipeableState.isAnimationRunning,
    onDragStarted = onDragStarted,
    onDragStopped = onDragStopped,
)
    .swipeAnchors(
        state = sheetState.swipeableState,
        anchorChangeHandler = anchorChangeHandler,
        possibleValues = if (sheetState.skipHiddenState) {
            setOf(
                FlexibleSheetValue.IntermediatelyExpanded,
                FlexibleSheetValue.SlightlyExpanded,
                FlexibleSheetValue.FullyExpanded,
            )
        } else {
            setOf(
                FlexibleSheetValue.Hidden,
                FlexibleSheetValue.IntermediatelyExpanded,
                FlexibleSheetValue.SlightlyExpanded,
                FlexibleSheetValue.FullyExpanded,
            )
        },
    ) { value, sheetSize ->

.... 생략

skipHiddenState의 값에따라 possibleValues를 다르게하여 보았습니다.

Allow expansion to be skipped when the sheet is added

Is your feature request related to a problem?

We'd like have the bottom sheet not automatically expand to intermediate height.

Describe the solution you'd like:

Add a new, optional parameter e.g. skipShow = false to the FlexibleBottomSheet constructor and use the parameter in the LaunchedEffect at the bottom of the file

if (!skipShow && sheetState.hasFullyExpandedState) {
        LaunchedEffect(sheetState) {
            sheetState.slightlyExpand()
        }
    }

Describe alternatives you've considered:

I've tried snapping to the desired target as a launched effect but it only works with a delay.

Show non-modal sheet above and under a BottomAppBar

Is your feature request related to a problem?

I am trying to use FlexibleBottomSheet on a screen that uses Scaffold and bottomBar. When I add the FlexibleBottomSheet to the screen it sits on top of the NavigationBar.

image

Using the following state:

rememberFlexibleBottomSheetState(
      isModal = false,
      skipSlightlyExpanded = true,
       flexibleSheetSize = FlexibleSheetSize().copy(
          fullyExpanded = 0.5f,
          intermediatelyExpanded = 0.05f, 
     )
)

Describe the solution you'd like:

I would like the sheet to be displayed below and above the NavigationBar. Basically sitting on top of it with a tiny amount visible, then expanding when the user drags up.

Describe alternatives you've considered:

I've tried adding Modifier.padding() but that causes the whole thing to vanish. I'm looking into setting the WindowInsets next.

When isModal is true screen turns white instead of dimmed

Please complete the following information:

  • Library Version 0.1.5
  • Affected Device(s) All

Describe the Bug:
When I set my BottomSheet to isModal = true the screen content( Except the bottom sheet) turns white instead of just dimmed.
This issue doesn't happen with isModal=false

Add a clear description about the problem.

Expected Behavior:

A clear description of what you expected to happen.
When a modal is created the rest of the screen should change the color to be slightly dimmed to focus the attention on the bottom sheet instead

sheetState isModal not updating

  • Library Version [0.1.1]
  • Affected Device(s) [Xiaomi Redmi 8 with Android 10]

sheetState isModal is not updating when changed during onTargetChanges function

        val scope = rememberCoroutineScope()
        var isModal : Boolean by remember { mutableStateOf(true) }
        val sheetState = rememberFlexibleBottomSheetState(
            flexibleSheetSize = FlexibleSheetSize(
                fullyExpanded = 1.0f,
                intermediatelyExpanded = 0.5f,
                slightlyExpanded = 0f
            ),
            isModal = isModal,
            skipSlightlyExpanded = false,
        )
        FlexibleBottomSheet(
            onDismissRequest = {
                scope.launch {
                    sheetState.hide()
                }
            },
            sheetState = sheetState,
            onTargetChanges = { sheetValue ->
                isModal = sheetValue.ordinal != 0
                println("$TAG Sheet SheetValue: $sheetValue || IsModal:: $isModal || sheetModal :: ${sheetState.isModal}")                
            },
        ) {
            Text(text = "Bottom Sheeeet!!!")
        }

While printing the logs i found below result
SheetValue: Hidden || IsModal:: false || sheetModal :: true

I want my bottom sheet to behave as Modal only when it is not hidden i.e., visible
If I set isModal as true, then I am not able to access the background content when the sheet is hidden/removed by the user.

Am i missing anything?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.