diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationState.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationState.kt
index e4f7fe1afd283dc07c10921777026af17aef831d..02db1646c66da391d5a69f763d9003eae1040a55 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationState.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/text/TextStoryPostCreationState.kt
@@ -4,6 +4,7 @@ import android.graphics.Color
 import android.os.Parcelable
 import androidx.annotation.ColorInt
 import androidx.annotation.IntRange
+import androidx.core.graphics.ColorUtils
 import kotlinx.parcelize.IgnoredOnParcel
 import kotlinx.parcelize.Parcelize
 import org.thoughtcrime.securesms.conversation.colors.ChatColors
@@ -28,14 +29,27 @@ data class TextStoryPostCreationState(
   val textForegroundColor: Int = when (textColorStyle) {
     TextColorStyle.NO_BACKGROUND -> textColor
     TextColorStyle.NORMAL -> textColor
-    TextColorStyle.INVERT -> Color.WHITE
+    TextColorStyle.INVERT -> getDefaultColorForLightness(textColor)
   }
 
   @ColorInt
   @IgnoredOnParcel
   val textBackgroundColor: Int = when (textColorStyle) {
     TextColorStyle.NO_BACKGROUND -> Color.TRANSPARENT
-    TextColorStyle.NORMAL -> Color.WHITE
+    TextColorStyle.NORMAL -> getDefaultColorForLightness(textColor)
     TextColorStyle.INVERT -> textColor
   }
+
+  private fun getDefaultColorForLightness(textColor: Int): Int {
+    val hsl = floatArrayOf(0f, 0f, 0f)
+    ColorUtils.colorToHSL(textColor, hsl)
+
+    val lightness = hsl[2]
+
+    return if (lightness >= 0.9f) {
+      Color.BLACK
+    } else {
+      Color.WHITE
+    }
+  }
 }
diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/HSVColorSlider.kt b/app/src/main/java/org/thoughtcrime/securesms/scribbles/HSVColorSlider.kt
index 5c26b8f0a554dae26b9dced14079722619ae004c..2bad473fe82e78e57c94260d360aaedb2d684443 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/HSVColorSlider.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/HSVColorSlider.kt
@@ -1,5 +1,6 @@
 package org.thoughtcrime.securesms.scribbles
 
+import android.animation.FloatEvaluator
 import android.graphics.Canvas
 import android.graphics.Color
 import android.graphics.ColorFilter
@@ -15,6 +16,7 @@ import androidx.annotation.ColorInt
 import androidx.annotation.Dimension
 import androidx.appcompat.widget.AppCompatSeekBar
 import androidx.core.graphics.ColorUtils
+import org.thoughtcrime.securesms.scribbles.HSVColorSlider.toHue
 import org.thoughtcrime.securesms.util.Util
 import org.thoughtcrime.securesms.util.ViewUtil
 import org.thoughtcrime.securesms.util.customizeOnDraw
@@ -30,29 +32,30 @@ object HSVColorSlider {
   private const val WHITE_DIVISIONS = 125
   private const val MAX_SEEK_DIVISIONS = COLOR_DIVISIONS + BLACK_DIVISIONS + WHITE_DIVISIONS
   private const val STANDARD_LIGHTNESS = 0.4f
+  private val EVALUATOR = FloatEvaluator()
 
-  private val colors: IntArray = (0..COLOR_DIVISIONS).map { hue ->
+  private val colors: IntArray = (0..BLACK_DIVISIONS).map { value ->
     ColorUtils.HSLToColor(
       floatArrayOf(
-        hue.toHue(COLOR_DIVISIONS),
+        MAX_HUE.toFloat(),
         1f,
-        calculateLightness(hue.toFloat(), STANDARD_LIGHTNESS)
+        value / BLACK_DIVISIONS.toFloat() * STANDARD_LIGHTNESS
       )
     )
-  }.toIntArray() + (BLACK_DIVISIONS downTo 0).map { value ->
+  }.toIntArray() + (0..COLOR_DIVISIONS).map { hue ->
     ColorUtils.HSLToColor(
       floatArrayOf(
-        MAX_HUE.toFloat(),
+        hue.toHue(COLOR_DIVISIONS),
         1f,
-        value / BLACK_DIVISIONS.toFloat() * STANDARD_LIGHTNESS
+        calculateLightness(hue.toFloat(), STANDARD_LIGHTNESS)
       )
     )
   }.toIntArray() + (0..WHITE_DIVISIONS).map { value ->
     ColorUtils.HSLToColor(
       floatArrayOf(
-        MAX_HUE.toFloat(),
-        0f,
-        value / WHITE_DIVISIONS.toFloat()
+        COLOR_DIVISIONS.toHue(COLOR_DIVISIONS),
+        1f,
+        EVALUATOR.evaluate(value / WHITE_DIVISIONS.toFloat(), calculateLightness(COLOR_DIVISIONS.toFloat(), STANDARD_LIGHTNESS), 1f)
       )
     )
   }.toIntArray()
diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt
index ee156ae8b3520e94f42c10a85420172b41ea87b5..29e34162cfb3ce60800fbaf99b4fb1542881141d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt
@@ -60,7 +60,7 @@ class StoryTextPostView @JvmOverloads constructor(
     textView.typeface = typeface
   }
 
-  fun setPostBackground(drawable: Drawable) {
+  private fun setPostBackground(drawable: Drawable) {
     backgroundView.setImageDrawable(drawable)
   }
 
@@ -72,30 +72,30 @@ class StoryTextPostView @JvmOverloads constructor(
     }
   }
 
-  fun setText(text: CharSequence, isPlaceholder: Boolean) {
+  private fun setText(text: CharSequence, isPlaceholder: Boolean) {
     this.isPlaceholder = isPlaceholder
     textView.text = text
   }
 
-  fun setTextSize(@Px textSize: Float) {
+  private fun setTextSize(@Px textSize: Float) {
     textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
   }
 
-  fun setTextGravity(textAlignment: TextAlignment) {
+  private fun setTextGravity(textAlignment: TextAlignment) {
     textView.gravity = textAlignment.gravity
   }
 
-  fun setTextScale(scalePercent: Int) {
+  private fun setTextScale(scalePercent: Int) {
     val scale = TextStoryScale.convertToScale(scalePercent)
     textView.scaleX = scale
     textView.scaleY = scale
   }
 
-  fun setTextVisible(visible: Boolean) {
+  private fun setTextVisible(visible: Boolean) {
     textView.visible = visible
   }
 
-  fun setTextBackgroundColor(@ColorInt color: Int) {
+  private fun setTextBackgroundColor(@ColorInt color: Int) {
     textView.setWrappedBackgroundColor(color)
   }