Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.

## [Unreleased]

## [1.0.0-beta16] - 2026-08-18

### Features
- New `ProgressIndicatorStyle.PILL`: the current step in a multi-step progress indicator renders as an elongated pill while the other steps stay small dots, like an iOS-style page indicator. `CoachmarkConfig.progressIndicatorStyle` (default `DOTS`, preserving the existing fill-up-to-current-step look) and `CoachmarkConfig.progressActivePillWidth` control it

### Sample App
- Added a "Start Tour (Pill)" button to the Multi-Step Sequence example to demo `ProgressIndicatorStyle.PILL`

## [1.0.0-beta15] - 2026-03-18

### Features
Expand Down
54 changes: 33 additions & 21 deletions lumen/api/android/lumen.api
Original file line number Diff line number Diff line change
Expand Up @@ -72,48 +72,50 @@ public final class io/luminos/CoachmarkColorsKt {

public final class io/luminos/CoachmarkConfig {
public static final field $stable I
public synthetic fun <init> (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZIILkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZLio/luminos/ProgressIndicatorStyle;FZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZIILkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZLio/luminos/ProgressIndicatorStyle;FZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1-D9Ej5fM ()F
public final fun component10 ()I
public final fun component11 ()I
public final fun component12 ()I
public final fun component13 ()Lio/luminos/ScrimOpacity;
public final fun component14 ()Lio/luminos/ScrimTapBehavior;
public final fun component15 ()Z
public final fun component16 ()Z
public final fun component17 ()Lio/luminos/BackPressBehavior;
public final fun component18 ()Lio/luminos/HighlightAnimation;
public final fun component19 ()I
public final fun component16 ()Lio/luminos/ProgressIndicatorStyle;
public final fun component17-D9Ej5fM ()F
public final fun component18 ()Z
public final fun component19 ()Lio/luminos/BackPressBehavior;
public final fun component2-D9Ej5fM ()F
public final fun component20 ()Z
public final fun component21 ()Ljava/lang/String;
public final fun component22 ()J
public final fun component23 ()Z
public final fun component20 ()Lio/luminos/HighlightAnimation;
public final fun component21 ()I
public final fun component22 ()Z
public final fun component23 ()Ljava/lang/String;
public final fun component24 ()J
public final fun component25 ()Ljava/lang/String;
public final fun component25 ()Z
public final fun component26 ()J
public final fun component27 ()Z
public final fun component28-D9Ej5fM ()F
public final fun component29-D9Ej5fM ()F
public final fun component27 ()Ljava/lang/String;
public final fun component28 ()J
public final fun component29 ()Z
public final fun component3-D9Ej5fM ()F
public final fun component30-D9Ej5fM ()F
public final fun component31-D9Ej5fM ()F
public final fun component32-e0LSkKk ()I
public final fun component33-e0LSkKk ()I
public final fun component32-D9Ej5fM ()F
public final fun component33-D9Ej5fM ()F
public final fun component34-e0LSkKk ()I
public final fun component35-e0LSkKk ()I
public final fun component36-e0LSkKk ()I
public final fun component37 ()Landroidx/compose/foundation/layout/Arrangement$Horizontal;
public final fun component38 ()Z
public final fun component37-e0LSkKk ()I
public final fun component38-e0LSkKk ()I
public final fun component39 ()Landroidx/compose/foundation/layout/Arrangement$Horizontal;
public final fun component4 ()F
public final fun component40 ()Z
public final fun component5 ()Lkotlin/jvm/functions/Function3;
public final fun component6-D9Ej5fM ()F
public final fun component7-D9Ej5fM ()F
public final fun component8-D9Ej5fM ()F
public final fun component9-D9Ej5fM ()F
public final fun copy-ZvfVXdg (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;Z)Lio/luminos/CoachmarkConfig;
public static synthetic fun copy-ZvfVXdg$default (Lio/luminos/CoachmarkConfig;FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZIILjava/lang/Object;)Lio/luminos/CoachmarkConfig;
public final fun copy-C8SqqoU (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZLio/luminos/ProgressIndicatorStyle;FZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;Z)Lio/luminos/CoachmarkConfig;
public static synthetic fun copy-C8SqqoU$default (Lio/luminos/CoachmarkConfig;FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZLio/luminos/ProgressIndicatorStyle;FZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZIILjava/lang/Object;)Lio/luminos/CoachmarkConfig;
public fun equals (Ljava/lang/Object;)Z
public final fun getBackPressBehavior ()Lio/luminos/BackPressBehavior;
public final fun getConnectorAnimationDuration ()I
Expand All @@ -133,6 +135,8 @@ public final class io/luminos/CoachmarkConfig {
public final fun getDontShowAgainTextAlign-e0LSkKk ()I
public final fun getFadeAnimationDuration ()I
public final fun getHighlightAnimation ()Lio/luminos/HighlightAnimation;
public final fun getProgressActivePillWidth-D9Ej5fM ()F
public final fun getProgressIndicatorStyle ()Lio/luminos/ProgressIndicatorStyle;
public final fun getPulseDurationMs ()I
public final fun getRetrySkippedTargets ()Z
public final fun getScrimOpacity ()Lio/luminos/ScrimOpacity;
Expand Down Expand Up @@ -323,7 +327,7 @@ public final class io/luminos/CoachmarkTarget {
}

public final class io/luminos/CoachmarkTooltipKt {
public static final fun CoachmarkTooltip-eWZOFlk (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILio/luminos/CoachmarkColors;FZZZLjava/lang/String;ZLjava/lang/String;ZLkotlin/jvm/functions/Function1;FFFLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;IIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZJFFLkotlin/jvm/functions/Function1;ZLandroidx/compose/runtime/Composer;IIIIII)V
public static final fun CoachmarkTooltip-CyZyjUA (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILio/luminos/CoachmarkColors;FZLio/luminos/ProgressIndicatorStyle;FZZLjava/lang/String;ZLjava/lang/String;ZLkotlin/jvm/functions/Function1;FFFLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;IIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZJFFLkotlin/jvm/functions/Function1;ZLandroidx/compose/runtime/Composer;IIIIII)V
}

public final class io/luminos/ConnectorEndStyle : java/lang/Enum {
Expand Down Expand Up @@ -465,6 +469,14 @@ public final class io/luminos/OverlayCoordinatorKt {
public static final fun rememberOverlayCoordinator (Landroidx/compose/runtime/Composer;I)Lio/luminos/OverlayCoordinator;
}

public final class io/luminos/ProgressIndicatorStyle : java/lang/Enum {
public static final field DOTS Lio/luminos/ProgressIndicatorStyle;
public static final field PILL Lio/luminos/ProgressIndicatorStyle;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Lio/luminos/ProgressIndicatorStyle;
public static fun values ()[Lio/luminos/ProgressIndicatorStyle;
}

public final class io/luminos/ScrimOpacity : java/lang/Enum {
public static final field DARK Lio/luminos/ScrimOpacity;
public static final field EXTRA_DARK Lio/luminos/ScrimOpacity;
Expand Down
54 changes: 33 additions & 21 deletions lumen/api/jvm/lumen.api
Original file line number Diff line number Diff line change
Expand Up @@ -68,48 +68,50 @@ public final class io/luminos/CoachmarkColorsKt {

public final class io/luminos/CoachmarkConfig {
public static final field $stable I
public synthetic fun <init> (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZIILkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZLio/luminos/ProgressIndicatorStyle;FZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZIILkotlin/jvm/internal/DefaultConstructorMarker;)V
public synthetic fun <init> (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZLio/luminos/ProgressIndicatorStyle;FZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1-D9Ej5fM ()F
public final fun component10 ()I
public final fun component11 ()I
public final fun component12 ()I
public final fun component13 ()Lio/luminos/ScrimOpacity;
public final fun component14 ()Lio/luminos/ScrimTapBehavior;
public final fun component15 ()Z
public final fun component16 ()Z
public final fun component17 ()Lio/luminos/BackPressBehavior;
public final fun component18 ()Lio/luminos/HighlightAnimation;
public final fun component19 ()I
public final fun component16 ()Lio/luminos/ProgressIndicatorStyle;
public final fun component17-D9Ej5fM ()F
public final fun component18 ()Z
public final fun component19 ()Lio/luminos/BackPressBehavior;
public final fun component2-D9Ej5fM ()F
public final fun component20 ()Z
public final fun component21 ()Ljava/lang/String;
public final fun component22 ()J
public final fun component23 ()Z
public final fun component20 ()Lio/luminos/HighlightAnimation;
public final fun component21 ()I
public final fun component22 ()Z
public final fun component23 ()Ljava/lang/String;
public final fun component24 ()J
public final fun component25 ()Ljava/lang/String;
public final fun component25 ()Z
public final fun component26 ()J
public final fun component27 ()Z
public final fun component28-D9Ej5fM ()F
public final fun component29-D9Ej5fM ()F
public final fun component27 ()Ljava/lang/String;
public final fun component28 ()J
public final fun component29 ()Z
public final fun component3-D9Ej5fM ()F
public final fun component30-D9Ej5fM ()F
public final fun component31-D9Ej5fM ()F
public final fun component32-e0LSkKk ()I
public final fun component33-e0LSkKk ()I
public final fun component32-D9Ej5fM ()F
public final fun component33-D9Ej5fM ()F
public final fun component34-e0LSkKk ()I
public final fun component35-e0LSkKk ()I
public final fun component36-e0LSkKk ()I
public final fun component37 ()Landroidx/compose/foundation/layout/Arrangement$Horizontal;
public final fun component38 ()Z
public final fun component37-e0LSkKk ()I
public final fun component38-e0LSkKk ()I
public final fun component39 ()Landroidx/compose/foundation/layout/Arrangement$Horizontal;
public final fun component4 ()F
public final fun component40 ()Z
public final fun component5 ()Lkotlin/jvm/functions/Function3;
public final fun component6-D9Ej5fM ()F
public final fun component7-D9Ej5fM ()F
public final fun component8-D9Ej5fM ()F
public final fun component9-D9Ej5fM ()F
public final fun copy-ZvfVXdg (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;Z)Lio/luminos/CoachmarkConfig;
public static synthetic fun copy-ZvfVXdg$default (Lio/luminos/CoachmarkConfig;FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZIILjava/lang/Object;)Lio/luminos/CoachmarkConfig;
public final fun copy-C8SqqoU (FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZLio/luminos/ProgressIndicatorStyle;FZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;Z)Lio/luminos/CoachmarkConfig;
public static synthetic fun copy-C8SqqoU$default (Lio/luminos/CoachmarkConfig;FFFFLkotlin/jvm/functions/Function3;FFFFIIILio/luminos/ScrimOpacity;Lio/luminos/ScrimTapBehavior;ZLio/luminos/ProgressIndicatorStyle;FZLio/luminos/BackPressBehavior;Lio/luminos/HighlightAnimation;IZLjava/lang/String;JZJLjava/lang/String;JZFFFFIIIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZIILjava/lang/Object;)Lio/luminos/CoachmarkConfig;
public fun equals (Ljava/lang/Object;)Z
public final fun getBackPressBehavior ()Lio/luminos/BackPressBehavior;
public final fun getConnectorAnimationDuration ()I
Expand All @@ -129,6 +131,8 @@ public final class io/luminos/CoachmarkConfig {
public final fun getDontShowAgainTextAlign-e0LSkKk ()I
public final fun getFadeAnimationDuration ()I
public final fun getHighlightAnimation ()Lio/luminos/HighlightAnimation;
public final fun getProgressActivePillWidth-D9Ej5fM ()F
public final fun getProgressIndicatorStyle ()Lio/luminos/ProgressIndicatorStyle;
public final fun getPulseDurationMs ()I
public final fun getRetrySkippedTargets ()Z
public final fun getScrimOpacity ()Lio/luminos/ScrimOpacity;
Expand Down Expand Up @@ -319,7 +323,7 @@ public final class io/luminos/CoachmarkTarget {
}

public final class io/luminos/CoachmarkTooltipKt {
public static final fun CoachmarkTooltip-eWZOFlk (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILio/luminos/CoachmarkColors;FZZZLjava/lang/String;ZLjava/lang/String;ZLkotlin/jvm/functions/Function1;FFFLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;IIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZJFFLkotlin/jvm/functions/Function1;ZLandroidx/compose/runtime/Composer;IIIIII)V
public static final fun CoachmarkTooltip-CyZyjUA (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILio/luminos/CoachmarkColors;FZLio/luminos/ProgressIndicatorStyle;FZZLjava/lang/String;ZLjava/lang/String;ZLkotlin/jvm/functions/Function1;FFFLkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;IIIILandroidx/compose/foundation/layout/Arrangement$Horizontal;ZJFFLkotlin/jvm/functions/Function1;ZLandroidx/compose/runtime/Composer;IIIIII)V
}

public final class io/luminos/ConnectorEndStyle : java/lang/Enum {
Expand Down Expand Up @@ -476,6 +480,14 @@ public final class io/luminos/PreferencesCoachmarkStorage : io/luminos/Coachmark
public fun remove (Ljava/lang/String;)V
}

public final class io/luminos/ProgressIndicatorStyle : java/lang/Enum {
public static final field DOTS Lio/luminos/ProgressIndicatorStyle;
public static final field PILL Lio/luminos/ProgressIndicatorStyle;
public static fun getEntries ()Lkotlin/enums/EnumEntries;
public static fun valueOf (Ljava/lang/String;)Lio/luminos/ProgressIndicatorStyle;
public static fun values ()[Lio/luminos/ProgressIndicatorStyle;
}

public final class io/luminos/ScrimOpacity : java/lang/Enum {
public static final field DARK Lio/luminos/ScrimOpacity;
public static final field EXTRA_DARK Lio/luminos/ScrimOpacity;
Expand Down
2 changes: 1 addition & 1 deletion lumen/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ android {
}
}

val libraryVersion = "1.0.0-beta15"
val libraryVersion = "1.0.0-beta16"
val libraryGroup = "io.github.aldefy"
val libraryArtifact = "lumen"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import com.github.takahirom.roborazzi.captureRoboImage
import io.luminos.CoachmarkTooltip
import io.luminos.DarkCoachmarkColors
import io.luminos.LightCoachmarkColors
import io.luminos.ProgressIndicatorStyle
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
Expand Down Expand Up @@ -83,6 +84,27 @@ class CoachmarkTooltipScreenshotTest {
capture("tooltip_multiStep_step2of4")
}

@Test
fun tooltip_multiStep_pillIndicator() {
composeTestRule.setContent {
MaterialTheme(colorScheme = lightColorScheme()) {
Box(modifier = Modifier.background(Color(0xFF1A1A2E)).padding(16.dp)) {
CoachmarkTooltip(
title = "Step 2",
description = "The current step renders as a pill; other steps stay dots.",
ctaText = "Next",
currentStep = 2,
totalSteps = 4,
colors = LightCoachmarkColors,
progressIndicatorStyle = ProgressIndicatorStyle.PILL,
onCtaClick = {},
)
}
}
}
capture("tooltip_multiStep_pillIndicator")
}

@Test
fun tooltip_withSkipButton() {
composeTestRule.setContent {
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions lumen/src/commonMain/kotlin/io/luminos/CoachmarkScrim.kt
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,10 @@ data class CoachmarkConfig(
val scrimTapBehavior: ScrimTapBehavior = ScrimTapBehavior.DISMISS,
/** Whether to show progress indicator dots for multi-step sequences */
val showProgressIndicator: Boolean = true,
/** Visual style for the progress indicator: small dots, or a pill for the current step */
val progressIndicatorStyle: ProgressIndicatorStyle = ProgressIndicatorStyle.DOTS,
/** Width of the active pill when [progressIndicatorStyle] is [ProgressIndicatorStyle.PILL] */
val progressActivePillWidth: Dp = 20.dp,
/** Whether to wrap the tooltip content in a card/box */
val showTooltipCard: Boolean = false,
/** Behavior when user presses the back button */
Expand Down Expand Up @@ -1049,6 +1053,8 @@ private fun BoxScope.TooltipContainer(
colors = colors,
cornerRadius = config.tooltipCornerRadius,
showProgressIndicator = showProgressIndicator,
progressIndicatorStyle = config.progressIndicatorStyle,
progressActivePillWidth = config.progressActivePillWidth,
showCard = config.showTooltipCard,
showSkipButton = config.showSkipButton,
skipButtonText = config.skipButtonText,
Expand Down
Loading
Loading