<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ismoy Belizaire</title>
    <description>The latest articles on DEV Community by Ismoy Belizaire (@ismoy).</description>
    <link>https://dev.to/ismoy</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2471422%2Fb982589d-455c-4e60-a924-5674a28b3c2b.jpeg</url>
      <title>DEV Community: Ismoy Belizaire</title>
      <link>https://dev.to/ismoy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ismoy"/>
    <language>en</language>
    <item>
      <title>ImagePickerKMP 1.0.23: Controling Camera Launch on iOS with `directCameraLaunch`</title>
      <dc:creator>Ismoy Belizaire</dc:creator>
      <pubDate>Wed, 03 Sep 2025 11:51:36 +0000</pubDate>
      <link>https://dev.to/ismoy/imagepickerkmp-1023-controling-camera-launch-on-ios-with-directcameralaunch-3bjn</link>
      <guid>https://dev.to/ismoy/imagepickerkmp-1023-controling-camera-launch-on-ios-with-directcameralaunch-3bjn</guid>
      <description>&lt;p&gt;The latest release of &lt;strong&gt;ImagePickerKMP (v1.0.23)&lt;/strong&gt; brings a small but&lt;br&gt;
powerful addition for iOS developers: a new flag called&lt;br&gt;
&lt;code&gt;directCameraLaunch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This feature gives you control over whether the image picker should&lt;br&gt;
&lt;strong&gt;open directly into the camera&lt;/strong&gt; or show the &lt;strong&gt;source selection&lt;br&gt;
dialog&lt;/strong&gt; first.&lt;/p&gt;
&lt;h2&gt;
  
  
  The New Flag: &lt;code&gt;directCameraLaunch&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;By default, the picker shows a dialog on iOS asking the user to choose&lt;br&gt;
between camera and gallery.\&lt;br&gt;
With &lt;code&gt;directCameraLaunch&lt;/code&gt;, you can now change that behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;directCameraLaunch = true&lt;/code&gt; → Skips the dialog and opens the
&lt;strong&gt;camera immediately&lt;/strong&gt;.\&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;directCameraLaunch = false&lt;/code&gt; → Keeps the &lt;strong&gt;dialog&lt;/strong&gt; so the user can
choose.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Usage Example
&lt;/h2&gt;

&lt;p&gt;Here's how you can use it with &lt;code&gt;ImagePickerLauncher&lt;/code&gt; in your Compose&lt;br&gt;
Multiplatform project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;    &lt;span class="nc"&gt;ImagePickerLauncher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ImagePickerConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;onPhotoCaptured&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
                &lt;span class="n"&gt;capturedPhoto&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
                &lt;span class="n"&gt;showCamera&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;onError&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;showCamera&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;onDismiss&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;showImagePicker&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt; &lt;span class="c1"&gt;// Reset state when user doesn't select anything&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;directCameraLaunch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt; &lt;span class="c1"&gt;// Set to true if you want to launch the camera directly Only IOS&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;This new option provides &lt;strong&gt;better UX flexibility&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Apps that want a streamlined flow (e.g., scanning receipts, IDs, QR
codes) can go straight to the camera.\&lt;/li&gt;
&lt;li&gt;  Apps that want to offer both gallery and camera selection can keep
the dialog.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: you now have the best of both worlds, controlled with a simple&lt;br&gt;
flag.&lt;/p&gt;
&lt;h2&gt;
  
  
  Dependency
&lt;/h2&gt;

&lt;p&gt;To try it out, update your Gradle dependency to the latest version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"io.github.ismoy:imagepickerkmp:1.0.23"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;directCameraLaunch&lt;/code&gt; flag makes ImagePickerKMP even more versatile&lt;br&gt;
for real-world use cases. Whether your app prioritizes fast camera&lt;br&gt;
access or user choice, you can now support both seamlessly with version&lt;br&gt;
&lt;strong&gt;1.0.23&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;Are you planning to use &lt;code&gt;directCameraLaunch&lt;/code&gt; in your project? Would you&lt;br&gt;
prefer the dialog or direct camera launch by default?&lt;/p&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/ismoy/ImagePickerKMP" rel="noopener noreferrer"&gt;https://github.com/ismoy/ImagePickerKMP&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kotlin Multiplatform + Compose: Unified Camera &amp; Gallery Picker with Expect/Actual and Permission Handling</title>
      <dc:creator>Ismoy Belizaire</dc:creator>
      <pubDate>Wed, 20 Aug 2025 13:55:30 +0000</pubDate>
      <link>https://dev.to/ismoy/kotlin-multiplatform-compose-unified-camera-gallery-picker-with-expectactual-and-permission-4573</link>
      <guid>https://dev.to/ismoy/kotlin-multiplatform-compose-unified-camera-gallery-picker-with-expectactual-and-permission-4573</guid>
      <description>&lt;p&gt;Handling image capture and gallery access in mobile apps is a task most developers face – but doing it the Kotlin Multiplatform way, using Compose, introduces unique challenges.&lt;/p&gt;

&lt;p&gt;In this post, I'll walk through how to create a shared, composable-based image picker using Kotlin's expect/actual mechanism. The result is a unified camera and gallery experience for Android and iOS, fully integrated with Compose Multiplatform UI.&lt;/p&gt;

&lt;p&gt;The Problem with Platform-Specific Image Pickers&lt;br&gt;
Image picking requires different APIs on Android and iOS:&lt;/p&gt;

&lt;p&gt;• Android: ActivityResultContracts, CameraX, media permissions&lt;/p&gt;

&lt;p&gt;• iOS: UIImagePickerController, delegate protocols, Info.plist&lt;/p&gt;

&lt;p&gt;• Compose Multiplatform has no built-in media picker&lt;/p&gt;

&lt;p&gt;• Permissions and file access require different logic per platform&lt;br&gt;
We want to hide this complexity and give developers a clean, shared interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Define expect functions in commonMain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We declare our public API with expect composables. These serve as the shared contract across platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ImagePickerLauncher&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
expect fun ImagePickerLauncher(
    config: ImagePickerConfig
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This picker handles capturing a photo with the camera. The config provides callbacks like onPhotoCaptured, onError, and onDismiss.&lt;/p&gt;

&lt;p&gt;GalleryPickerLauncher&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
expect fun GalleryPickerLauncher(
    onPhotosSelected: (List&amp;lt;PhotoResult&amp;gt;) -&amp;gt; Unit,
    onError: (Exception) -&amp;gt; Unit,
    onDismiss: () -&amp;gt; Unit = {},
    allowMultiple: Boolean = false,
    mimeTypes: List&amp;lt;String&amp;gt; = listOf("image/*"),
    selectionLimit: Long = SELECTION_LIMIT
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This version supports selecting one or multiple images and filtering by MIME type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Android Implementation&lt;/strong&gt;&lt;br&gt;
The Android actual implementation uses Compose with platform-aware context handling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
actual fun ImagePickerLauncher(config: ImagePickerConfig) {
    val context = LocalContext.current
    if (context !is ComponentActivity) {
        config.onError(Exception("Invalid context"))
        return
    }

    CameraCaptureView(
        activity = context,
        onPhotoResult = { result -&amp;gt; config.onPhotoCaptured(result) },
        onPhotosSelected = config.onPhotosSelected,
        onError = config.onError,
        onDismiss = config.onDismiss,
        cameraCaptureConfig = config.cameraCaptureConfig
    )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For gallery access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
actual fun GalleryPickerLauncher(...) {
    val context = LocalContext.current
    if (context !is ComponentActivity) {
        onError(Exception("Invalid context"))
        return
    }

    val config = GalleryPickerConfig(
        context = context,
        onPhotosSelected = onPhotosSelected,
        onError = onError,
        onDismiss = onDismiss,
        allowMultiple = allowMultiple,
        mimeTypes = mimeTypes
    )

    GalleryPickerLauncherContent(config)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;iOS Implementation&lt;/strong&gt;&lt;br&gt;
On iOS, we integrate UIKit behavior with Compose state, launching the correct picker depending on user action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
actual fun ImagePickerLauncher(config: ImagePickerConfig) {
    var showDialog by remember { mutableStateOf(true) }
    var askCameraPermission by remember { mutableStateOf(false) }
    var launchCamera by remember { mutableStateOf(false) }
    var launchGallery by remember { mutableStateOf(false) }

    handleImagePickerState(
        showDialog = showDialog,
        askCameraPermission = askCameraPermission,
        launchCamera = launchCamera,
        launchGallery = launchGallery,
        config = config,
        onDismissDialog = { showDialog = false },
        onCancelDialog = {
            showDialog = false
            config.onDismiss()
        },
        onRequestCameraPermission = { askCameraPermission = true },
        onRequestGallery = { launchGallery = true },
        onCameraPermissionGranted = {
            askCameraPermission = false
            launchCamera = true
        },
        onCameraPermissionDenied = {
            askCameraPermission = false
            config.onDismiss()
        },
        onCameraFinished = { launchCamera = false },
        onGalleryFinished = { launchGallery = false }
    )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And for gallery selection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Composable
actual fun GalleryPickerLauncher(...) {
    LaunchedEffect(Unit) {
        if (allowMultiple) {
            val selectedImages = mutableListOf&amp;lt;PhotoResult&amp;gt;()
            GalleryPickerOrchestrator.launchGallery(
                onPhotoSelected = { result -&amp;gt;
                    selectedImages.add(result)
                    onPhotosSelected(selectedImages.toList())
                },
                onError = onError,
                onDismiss = onDismiss,
                allowMultiple = true,
                selectionLimit = selectionLimit
            )
        } else {
            GalleryPickerOrchestrator.launchGallery(
                onPhotoSelected = { result -&amp;gt; onPhotosSelected(listOf(result)) },
                onError = onError,
                onDismiss = onDismiss,
                allowMultiple = false,
                selectionLimit = 1
            )
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How It All Comes Together in Compose&lt;/strong&gt;&lt;br&gt;
With both platform implementations hidden, your shared Compose code stays clean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (showCamera) {
    ImagePickerLauncher(
        config = ImagePickerConfig(
            onPhotoCaptured = { photo -&amp;gt; capturedPhoto = photo },
            onError = { showError = true },
            onDismiss = { showCamera = false }
        )
    )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And for gallery:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (showGallery) {
    GalleryPickerLauncher(
        onPhotosSelected = { photos -&amp;gt; selectedImages = photos },
        onError = { showError = true },
        onDismiss = { showGallery = false },
        allowMultiple = true
    )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This Pattern Works&lt;/strong&gt;&lt;br&gt;
• Shared UI remains fully declarative and platform-agnostic&lt;/p&gt;

&lt;p&gt;• Permissions and platform quirks are abstracted&lt;/p&gt;

&lt;p&gt;• It respects Compose principles and KMP architecture&lt;/p&gt;

&lt;p&gt;• You avoid boilerplate and platform channels&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kotlin Multiplatform offers powerful abstractions when used correctly. By leveraging expect/actual and fully composable APIs, we've built a clean, testable, and scalable image picker that works across platforms.&lt;/p&gt;

&lt;p&gt;You can explore the full implementation in &lt;a href="https://github.com/ismoy/ImagePickerKMP" rel="noopener noreferrer"&gt;ImagePickerKMP&lt;/a&gt;, an open-source project that follows these principles. Whether you use it directly or as inspiration, it's a practical example of Compose and KMP working in harmony.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>kotlin</category>
      <category>android</category>
      <category>ios</category>
    </item>
    <item>
      <title>🎯 What’s New in v1.0.21?</title>
      <dc:creator>Ismoy Belizaire</dc:creator>
      <pubDate>Tue, 12 Aug 2025 14:56:03 +0000</pubDate>
      <link>https://dev.to/ismoy/whats-new-in-v1021-3lk4</link>
      <guid>https://dev.to/ismoy/whats-new-in-v1021-3lk4</guid>
      <description>&lt;p&gt;🎉 &lt;strong&gt;ImagePickerKMP v1.0.21 – A Fresh New Look for iOS &amp;amp; Android!&lt;/strong&gt; 🎉  &lt;/p&gt;

&lt;p&gt;Hey there, fellow Kotlin Multiplatform enthusiasts!  &lt;/p&gt;

&lt;p&gt;I’m thrilled to announce the latest release of &lt;strong&gt;ImagePickerKMP&lt;/strong&gt; – the cross‑platform image picker &amp;amp; camera library that lets you pull photos from the gallery or capture new ones with a single line of code. 🚀  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Release:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Version:&lt;/strong&gt; v1.0.21
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag:&lt;/strong&gt; &lt;a href="https://github.com/ismoy/ImagePickerKMP/releases/tag/v1.0.21" rel="noopener noreferrer"&gt;v1.0.21&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Date:&lt;/strong&gt; 2025‑08‑11
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/ismoy/ImagePickerKMP" rel="noopener noreferrer"&gt;ImagePickerKMP on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this update, we’re adding &lt;em&gt;custom bottom sheet support for iOS&lt;/em&gt; and &lt;em&gt;customizable confirmation UI for Android&lt;/em&gt;. Let’s dive into the details!  &lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 What’s New in v1.0.21?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Custom Bottom Sheet on iOS
&lt;/h3&gt;

&lt;p&gt;Previously, the iOS picker presented the standard &lt;code&gt;UIImagePickerController&lt;/code&gt; UI. While functional, it left designers with limited styling options. This release introduces a &lt;strong&gt;&lt;code&gt;CustomBottomSheet&lt;/code&gt;&lt;/strong&gt; component that can be fully themed, animated, and integrated into your Compose UI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;ImagePicker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;IOS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// Custom bottom sheet&lt;/span&gt;
    &lt;span class="n"&gt;bottomSheet&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; 
        &lt;span class="nc"&gt;CustomBottomSheet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;onDismiss&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;style&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BottomSheetStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;backgroundColor&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;White&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;cornerRadius&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Key benefits:&lt;/em&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎨 Full control over colors, shapes, and shadows.
&lt;/li&gt;
&lt;li&gt;📲 Seamless integration with your existing Compose layout.
&lt;/li&gt;
&lt;li&gt;🔄 Consistent behavior across iOS versions.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2️⃣ Customizable Confirmation View on Android
&lt;/h3&gt;

&lt;p&gt;On Android, after a user selects an image, the picker used to show a default “Confirm” dialog. We now provide a &lt;strong&gt;&lt;code&gt;ConfirmView&lt;/code&gt;&lt;/strong&gt; composable that can be swapped out for any design.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;ImagePicker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;modifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxWidth&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Android&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;confirmView&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
        &lt;span class="nc"&gt;MyCustomConfirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;onConfirm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* Handle confirm */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="n"&gt;onCancel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* Handle cancel */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;What you can change:&lt;/em&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Button styles, text, icons.
&lt;/li&gt;
&lt;li&gt;Layout – grid, carousel, or single‑image preview.
&lt;/li&gt;
&lt;li&gt;Animation – fade, slide, or custom physics.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These changes empower designers to keep the UI in line with their brand while still leveraging the power of Kotlin Multiplatform.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Improvements &amp;amp; Fixes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;iOS Picker&lt;/td&gt;
&lt;td&gt;The picker would crash on iOS 16 if the user denied camera permission.&lt;/td&gt;
&lt;td&gt;Added robust permission handling and graceful fallback.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android Picker&lt;/td&gt;
&lt;td&gt;Confirmation dialog flickered on orientation change.&lt;/td&gt;
&lt;td&gt;Implemented state‑saving across configuration changes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Minor lag when loading high‑resolution images.&lt;/td&gt;
&lt;td&gt;Optimized bitmap decoding with &lt;code&gt;ImageDecoder&lt;/code&gt; and lazy loading.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;bottomSheet&lt;/code&gt; API lacked examples.&lt;/td&gt;
&lt;td&gt;Updated README with usage snippets and style reference.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependency Management&lt;/td&gt;
&lt;td&gt;Outdated Compose Multiplatform version (1.5.0).&lt;/td&gt;
&lt;td&gt;Bumped to 1.5.2 and updated compiler flags.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If you’re still on Kotlin 1.9.10 or Compose 1.5.0, consider upgrading to benefit from the performance tweaks and bug fixes.  &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📦 How to Update
&lt;/h2&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Add the dependency&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you’re already using ImagePickerKMP, simply bump the version in your &lt;code&gt;build.gradle.kts&lt;/code&gt; (or &lt;code&gt;build.gradle&lt;/code&gt; if you’re using Groovy).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;dependencies&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.github.ismoy:ImagePickerKMP:1.0.21"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2️⃣ &lt;strong&gt;Sync &amp;amp; Rebuild&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Run &lt;code&gt;./gradlew clean build&lt;/code&gt; or use your IDE’s Gradle sync.  &lt;/p&gt;

&lt;p&gt;3️⃣ &lt;strong&gt;Migrate Custom UI&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you’re using the new custom bottom sheet or confirmation view, replace the old API calls with the new ones shown above.  &lt;/p&gt;

&lt;p&gt;4️⃣ &lt;strong&gt;Test&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Run your app on both Android and iOS simulators/devices to confirm the UI behaves as expected.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; No breaking changes in the public API, so your existing code should compile without modification unless you decide to adopt the new custom UI components.&lt;/p&gt;




&lt;h2&gt;
  
  
  🙏 A Huge Thank You!
&lt;/h2&gt;

&lt;p&gt;This release wouldn’t have been possible without the dedication of the community. A special shout‑out to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/ismoy"&gt;@ismoy&lt;/a&gt;&lt;/strong&gt; – for spearheading the project and keeping the roadmap steady.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All contributors&lt;/strong&gt; – for reviewing PRs, reporting bugs, and suggesting UI tweaks.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your feedback keeps this library robust and user‑friendly. Keep the issues coming, and let’s keep building great cross‑platform code together!  &lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Try It Out Today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Download&lt;/strong&gt; the latest release from the &lt;a href="https://github.com/ismoy/ImagePickerKMP/releases/tag/v1.0.21" rel="noopener noreferrer"&gt;Releases page&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore&lt;/strong&gt; the new demo app in the &lt;code&gt;demo&lt;/code&gt; folder – it now showcases the custom bottom sheet on iOS and the custom confirmation view on Android.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share&lt;/strong&gt; your experience on Twitter or LinkedIn using #ImagePickerKMP and let us know how you’re styling your picker!
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to fork the repo, experiment with the new UI components, and submit your own pull requests. The library is open source, and every contribution helps make cross‑platform development smoother for everyone.  &lt;/p&gt;




&lt;h3&gt;
  
  
  Quick Recap
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;How to Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custom Bottom Sheet&lt;/td&gt;
&lt;td&gt;iOS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bottomSheet = { image -&amp;gt; CustomBottomSheet(...) }&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom Confirmation View&lt;/td&gt;
&lt;td&gt;Android&lt;/td&gt;
&lt;td&gt;&lt;code&gt;confirmView = { image -&amp;gt; MyCustomConfirm(...) }&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permission Handling&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;Automatic – no extra code needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance Optimizations&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;Transparent – just upgrade!&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Got questions? Drop an issue on GitHub or ping me on Discord (link in the README).  &lt;/p&gt;

&lt;p&gt;Let’s keep the momentum going and continue to push the boundaries of what Kotlin Multiplatform can do!  &lt;/p&gt;

&lt;p&gt;Happy coding! 🧑‍💻✨  &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/ismoy/ImagePickerKMP" rel="noopener noreferrer"&gt;https://github.com/ismoy/ImagePickerKMP&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Release Tag:&lt;/strong&gt; &lt;a href="https://github.com/ismoy/ImagePickerKMP/releases/tag/v1.0.21" rel="noopener noreferrer"&gt;https://github.com/ismoy/ImagePickerKMP/releases/tag/v1.0.21&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Stars:&lt;/strong&gt; ⭐ 38 | &lt;strong&gt;Forks:&lt;/strong&gt; 🍴 4 | &lt;strong&gt;Contributors:&lt;/strong&gt; 👥 1  &lt;/p&gt;




&lt;p&gt;&lt;em&gt;Keep exploring. Keep sharing. Keep building.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>development</category>
      <category>programming</category>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>🎉 ¡ImagePickerKMP v1.0.21 ya está aquí! 🚀</title>
      <dc:creator>Ismoy Belizaire</dc:creator>
      <pubDate>Tue, 12 Aug 2025 14:46:52 +0000</pubDate>
      <link>https://dev.to/ismoy/imagepickerkmp-v1021-ya-esta-aqui-4o0e</link>
      <guid>https://dev.to/ismoy/imagepickerkmp-v1021-ya-esta-aqui-4o0e</guid>
      <description>&lt;h1&gt;
  
  
  🎉 ¡ImagePickerKMP v1.0.21 ya está aquí! 🚀
&lt;/h1&gt;

&lt;p&gt;¡Hola comunidad de desarrolladores!&lt;br&gt;&lt;br&gt;
Hoy es un día emocionante para todos los que usan &lt;strong&gt;ImagePickerKMP&lt;/strong&gt;: la nueva versión &lt;strong&gt;v1.0.21&lt;/strong&gt; (etiquetada &lt;em&gt;“New Feature”&lt;/em&gt;) ya está disponible en GitHub. Este release trae dos mejoras muy solicitadas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bottom sheet personalizado en iOS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vista de confirmación configurables en Android&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Acompáñame a desglosar lo que implica esta actualización, cómo integrarla en tus proyectos y por qué deberías instalarla ya mismo. 💡&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 ¿Qué trae la nueva versión?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Bottom Sheet Customizable (iOS)
&lt;/h3&gt;

&lt;p&gt;Hasta ahora, la librería ya ofrecía una experiencia nativa en iOS con un &lt;em&gt;Action Sheet&lt;/em&gt; tradicional. Con v1.0.21, puedes &lt;strong&gt;definir tu propio diseño&lt;/strong&gt; para el &lt;em&gt;bottom sheet&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Componentes de Compose&lt;/strong&gt;: Usa tus propios composables para el encabezado, la lista de opciones y los botones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animaciones personalizadas&lt;/strong&gt;: Controla la duración, la interpolación y los efectos de entrada/ salida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accesibilidad mejorada&lt;/strong&gt;: Los elementos son fácilmente navegables con VoiceOver gracias a los nuevos atributos.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ejemplo rápido&lt;/strong&gt;  &lt;/p&gt;


&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;imagePicker&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ImagePicker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;iOS&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;IosConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;customBottomSheet&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;MyCustomBottomSheet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;onImageSelected&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="n"&gt;onCancel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Con esto, tu &lt;em&gt;bottom sheet&lt;/em&gt; se ajusta a la identidad visual de tu app sin sacrificar la experiencia nativa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2️⃣ Confirmación Visual en Android
&lt;/h3&gt;

&lt;p&gt;Para Android, la librería siempre ofrecía una ventana modal de confirmación sencilla. Ahora puedes &lt;strong&gt;personalizarla&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Layouts con Compose&lt;/strong&gt;: Diseña la vista con &lt;code&gt;@Composable&lt;/code&gt; y pásala a la configuración.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animaciones de entrada&lt;/strong&gt;: Elige entre fade, slide, o tus propias animaciones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Botones alternativos&lt;/strong&gt;: Cambia el texto, iconos o colores según tu branding.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Código de ejemplo&lt;/strong&gt;  &lt;/p&gt;


&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;imagePicker&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ImagePicker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;android&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AndroidConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;customConfirmationDialog&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;MyConfirmationDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;onConfirm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="n"&gt;onCancel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Así garantizas que la experiencia de selección sea coherente con el resto de tu UI.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛠️ Mejoras y correcciones
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Categoría&lt;/th&gt;
&lt;th&gt;Detalle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Estabilidad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Se arregló un &lt;em&gt;crash&lt;/em&gt; al cerrar el picker en modo &lt;em&gt;fullscreen&lt;/em&gt; en iOS 17.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rendimiento&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optimización de la carga de imágenes en Android, reduciendo el consumo de memoria en un 15%.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compatibilidad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Soporte actualizado para Kotlin 2.0 y Compose 1.6.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accesibilidad&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Se añadió soporte completo para TalkBack y VoiceOver en ambas plataformas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bugfix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Se corrigió la falta de respuesta en la opción de “tomar foto” cuando el permiso de cámara estaba denegado.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Estas mejoras garantizan que la librería siga siendo robusta y confiable en los entornos más exigentes.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 ¿Cómo actualizar?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Cambia la versión en tu &lt;code&gt;build.gradle.kts&lt;/code&gt; (Kotlin DSL)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nf"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"io.github.ismoy:ImagePickerKMP:1.0.21"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2️⃣ Si usas Gradle Groovy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"io.github.ismoy:ImagePickerKMP:1.0.21"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3️⃣ Revisa la documentación de configuración
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;iOS&lt;/strong&gt;: La nueva API &lt;code&gt;IocConfig.customBottomSheet&lt;/code&gt; se encuentra en la sección &lt;em&gt;Custom UI&lt;/em&gt; del README.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android&lt;/strong&gt;: La opción &lt;code&gt;AndroidConfig.customConfirmationDialog&lt;/code&gt; se describe bajo &lt;em&gt;Extending the UI&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Si tu proyecto ya usa la configuración por defecto, simplemente ignora los parámetros. La librería seguirá funcionando como antes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4️⃣ Prueba en ambos dispositivos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;En iOS: Ejecuta tu app en un simulador o dispositivo real y verifica que el &lt;em&gt;bottom sheet&lt;/em&gt; se muestre con tu diseño.&lt;/li&gt;
&lt;li&gt;En Android: Asegúrate de que la ventana de confirmación aparece y se comporta como esperas.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🙏 Agradecimientos
&lt;/h2&gt;

&lt;p&gt;Quiero extender un agradecimiento muy especial a &lt;strong&gt;[ismoy]&lt;/strong&gt; por liderar este proyecto y a todos los colaboradores que han contribuido con código, pruebas y documentación. Cada estrella 🌟, fork y comentario en GitHub demuestra que la comunidad está creciendo y, sin duda, la calidad de ImagePickerKMP se eleva gracias a ustedes.&lt;/p&gt;




&lt;h2&gt;
  
  
  📥 ¡Descárgala y pruébala ya!
&lt;/h2&gt;

&lt;p&gt;No esperes más:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visita la página de lanzamientos: &lt;a href="https://github.com/ismoy/ImagePickerKMP/releases/tag/v1.0.21" rel="noopener noreferrer"&gt;https://github.com/ismoy/ImagePickerKMP/releases/tag/v1.0.21&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Descarga el paquete y actualiza tu proyecto.
&lt;/li&gt;
&lt;li&gt;Comparte tus experiencias, ideas o pull requests en el repositorio.
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“Un buen proyecto no se mide solo por su código, sino por la comunidad que lo respalda.” – &lt;em&gt;Kotlin &amp;amp; Compose Enthusiasts&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🎨 ¿Tienes un diseño que quieres compartir?
&lt;/h3&gt;

&lt;p&gt;Si ya has creado un &lt;em&gt;bottom sheet&lt;/em&gt; o una ventana de confirmación personalizada y crees que podría ser útil para otros, ¡no dudes en abrir un PR! La comunidad se beneficia cuando compartimos nuestras mejoras.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Enlaces útiles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📂 Repositorio principal: &lt;a href="https://github.com/ismoy/ImagePickerKMP" rel="noopener noreferrer"&gt;https://github.com/ismoy/ImagePickerKMP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📥 Releases: &lt;a href="https://github.com/ismoy/ImagePickerKMP/releases" rel="noopener noreferrer"&gt;https://github.com/ismoy/ImagePickerKMP/releases&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 Documentación oficial: &lt;a href="https://github.com/ismoy/ImagePickerKMP/blob/main/README.md" rel="noopener noreferrer"&gt;https://github.com/ismoy/ImagePickerKMP/blob/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📬 Issues &amp;amp; Pull Requests: &lt;a href="https://github.com/ismoy/ImagePickerKMP/issues" rel="noopener noreferrer"&gt;https://github.com/ismoy/ImagePickerKMP/issues&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✨ Conclusión
&lt;/h3&gt;

&lt;p&gt;ImagePickerKMP v1.0.21 abre nuevas posibilidades de personalización y ofrece una experiencia más fluida y accesible en ambas plataformas. Si tu app necesita un selector de imágenes o cámara nativo, esta versión es el momento perfecto para implementarlo.&lt;/p&gt;

&lt;p&gt;¡Explora, prueba y comparte! 🚀📸  &lt;/p&gt;

&lt;p&gt;¡Hasta la próxima, comunidad! 👋&lt;/p&gt;

</description>
      <category>desarrollo</category>
      <category>programación</category>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>Cross-Platform Image Picker for Kotlin Multiplatform &amp; Android Native - Open Source Library</title>
      <dc:creator>Ismoy Belizaire</dc:creator>
      <pubDate>Sun, 27 Jul 2025 23:02:27 +0000</pubDate>
      <link>https://dev.to/ismoy/cross-platform-image-picker-for-kotlin-multiplatform-android-native-open-source-library-2f46</link>
      <guid>https://dev.to/ismoy/cross-platform-image-picker-for-kotlin-multiplatform-android-native-open-source-library-2f46</guid>
      <description>&lt;p&gt;Hey everyone!&lt;/p&gt;

&lt;p&gt;I just published an article introducing ImagePickerKMP, an open-source image picker library that works across Android and iOS using Kotlin Multiplatform.&lt;/p&gt;

&lt;p&gt;It supports both Jetpack Compose Multiplatform and Android Native, with: &lt;br&gt;
•Camera capture with confirmation and flash toggle &lt;br&gt;
•Gallery selection (single &amp;amp; multiple) &lt;br&gt;
•Permission handling on both platforms&lt;br&gt;
•Easy-to-use API and customizable UI&lt;/p&gt;

&lt;p&gt;If you’re building a KMP app or just want a solid image picker for Android, check it out. Feedback and contributions are welcome! 🔗 GitHub: &lt;a href="https://github.com/ismoy/ImagePickerKMP" rel="noopener noreferrer"&gt;https://github.com/ismoy/ImagePickerKMP&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>programming</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
