diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,11 @@
 # Changelog for dear-imgui
 
+## [2.1.3]
+
+- Fixed off-by-1 in internal Text wrapper.
+- Fixed sliderFloat* Raw calls
+- Added `formatPtr` to Raw.dragFloat* and Raw.sliderFloat*
+
 ## [2.1.2]
 
 - Fixed glfw example build flags.
@@ -100,6 +106,7 @@
 [2.1.0]: https://github.com/haskell-game/dear-imgui.hs/tree/v2.1.0
 [2.1.1]: https://github.com/haskell-game/dear-imgui.hs/tree/v2.1.1
 [2.1.2]: https://github.com/haskell-game/dear-imgui.hs/tree/v2.1.2
+[2.1.3]: https://github.com/haskell-game/dear-imgui.hs/tree/v2.1.3
 
 [1.87]: https://github.com/ocornut/imgui/releases/tag/v1.87
 [1.86]: https://github.com/ocornut/imgui/releases/tag/v1.86
diff --git a/dear-imgui.cabal b/dear-imgui.cabal
--- a/dear-imgui.cabal
+++ b/dear-imgui.cabal
@@ -1,7 +1,7 @@
 cabal-version: 3.0
 
 name: dear-imgui
-version: 2.1.2
+version: 2.1.3
 author: Oliver Charles
 maintainer: ollie@ocharles.org.uk, aenor.realm@gmail.com
 license: BSD-3-Clause
@@ -390,8 +390,9 @@
       , vector
          ^>= 0.12.1.2
       , vulkan
-         ^>= 3.9
+         >= 3.12
       , vulkan-utils
-         ^>= 0.4.1
+         >= 0.5
       , VulkanMemoryAllocator
+         >= 0.7.1
       , JuicyPixels
diff --git a/src/DearImGui.hs b/src/DearImGui.hs
--- a/src/DearImGui.hs
+++ b/src/DearImGui.hs
@@ -646,7 +646,7 @@
   currentValue <- get ref
   with (realToFrac currentValue) \floatPtr -> do
     changed <- Text.withCString desc \descPtr ->
-      Raw.dragFloat descPtr floatPtr (CFloat speed) (CFloat minValue) (CFloat maxValue)
+      Raw.dragFloat descPtr floatPtr (CFloat speed) (CFloat minValue) (CFloat maxValue) nullPtr
 
     when changed do
       newValue <- peek floatPtr
@@ -661,7 +661,7 @@
   (x, y) <- get ref
   withArray [ realToFrac x, realToFrac y ] \floatPtr -> do
     changed <- Text.withCString desc \descPtr ->
-      Raw.dragFloat2 descPtr floatPtr (CFloat speed) (CFloat minValue) (CFloat maxValue)
+      Raw.dragFloat2 descPtr floatPtr (CFloat speed) (CFloat minValue) (CFloat maxValue) nullPtr
 
     when changed do
       [x', y'] <- peekArray 2 floatPtr
@@ -675,7 +675,7 @@
   (x, y, z) <- get ref
   withArray [ realToFrac x, realToFrac y, realToFrac z ] \floatPtr -> do
     changed <- Text.withCString desc \descPtr ->
-      Raw.dragFloat3 descPtr floatPtr (CFloat speed) (CFloat minValue) (CFloat maxValue)
+      Raw.dragFloat3 descPtr floatPtr (CFloat speed) (CFloat minValue) (CFloat maxValue) nullPtr
 
     when changed do
       [x', y', z'] <- peekArray 3 floatPtr
@@ -690,7 +690,7 @@
   (x, y, z, u) <- get ref
   withArray [ realToFrac x, realToFrac y, realToFrac z, realToFrac u ] \floatPtr -> do
     changed <- Text.withCString desc \descPtr ->
-      Raw.dragFloat4 descPtr floatPtr (CFloat speed) (CFloat minValue) (CFloat maxValue)
+      Raw.dragFloat4 descPtr floatPtr (CFloat speed) (CFloat minValue) (CFloat maxValue) nullPtr
 
     when changed do
       [x', y', z', u'] <- peekArray 4 floatPtr
@@ -969,7 +969,7 @@
   currentValue <- get ref
   with (realToFrac currentValue) \floatPtr -> do
     changed <- Text.withCString desc \descPtr ->
-      Raw.sliderFloat descPtr floatPtr (CFloat minValue) (CFloat maxValue)
+      Raw.sliderFloat descPtr floatPtr (CFloat minValue) (CFloat maxValue) nullPtr
 
     when changed do
       newValue <- peek floatPtr
@@ -983,7 +983,7 @@
   (x, y) <- get ref
   withArray [ realToFrac x, realToFrac y ] \floatPtr -> do
     changed <- Text.withCString desc \descPtr ->
-      Raw.sliderFloat descPtr floatPtr (CFloat minValue) (CFloat maxValue)
+      Raw.sliderFloat2 descPtr floatPtr (CFloat minValue) (CFloat maxValue) nullPtr
 
     when changed do
       [x', y'] <- peekArray 2 floatPtr
@@ -997,7 +997,7 @@
   (x, y, z) <- get ref
   withArray [ realToFrac x, realToFrac y, realToFrac z ] \floatPtr -> do
     changed <- Text.withCString desc \descPtr ->
-      Raw.sliderFloat descPtr floatPtr (CFloat minValue) (CFloat maxValue)
+      Raw.sliderFloat3 descPtr floatPtr (CFloat minValue) (CFloat maxValue) nullPtr
 
     when changed do
       [x', y', z'] <- peekArray 3 floatPtr
@@ -1011,7 +1011,7 @@
   (x, y, z, u) <- get ref
   withArray [ realToFrac x, realToFrac y, realToFrac z, realToFrac u ] \floatPtr -> do
     changed <- Text.withCString desc \descPtr ->
-      Raw.sliderFloat descPtr floatPtr (CFloat minValue) (CFloat maxValue)
+      Raw.sliderFloat4 descPtr floatPtr (CFloat minValue) (CFloat maxValue) nullPtr
 
     when changed do
       [x', y', z', u'] <- peekArray 4 floatPtr
diff --git a/src/DearImGui/Internal/Text.hs b/src/DearImGui/Internal/Text.hs
--- a/src/DearImGui/Internal/Text.hs
+++ b/src/DearImGui/Internal/Text.hs
@@ -13,7 +13,6 @@
   ) where
 
 -- base
-import Control.Monad.IO.Class (liftIO)
 import Foreign (nullPtr, plusPtr)
 import Foreign.C.String (CString)
 import qualified GHC.Foreign as Foreign
@@ -26,35 +25,40 @@
 -- unliftio-core
 import UnliftIO (MonadUnliftIO, UnliftIO(..), withUnliftIO)
 
-#if MIN_VERSION_text(2,0,0)
+#if MIN_VERSION_text(2,0,1)
+-- XXX: just wrap the provided combinator
 
-import Data.Text.Foreign (lengthWord8, unsafeCopyToPtr)
-import Data.Word (Word8)
-import Foreign (castPtr, free, mallocBytes, pokeByteOff)
-import UnliftIO.Exception (bracket)
+import qualified Data.Text.Foreign as Text
 
 withCString :: MonadUnliftIO m => Text -> (CString -> m a) -> m a
-withCString t = bracket create destroy
-  where
-    size0 = lengthWord8 t + 1
+withCString text action =
+  withUnliftIO $ \(UnliftIO unlift) ->
+    Text.withCString text $ \buf ->
+      unlift $ action buf
 
-    create = liftIO $ do
-      ptr <- mallocBytes size0
-      unsafeCopyToPtr t (castPtr ptr)
-      pokeByteOff ptr size0 (0 :: Word8)
-      pure ptr
+#elif MIN_VERSION_text(2,0,0)
+-- XXX: the text is UTF-8, alas no withCString is available
 
-    destroy ptr =
-      liftIO $ free ptr
+import Data.Text.Foreign (lengthWord8, unsafeCopyToPtr)
+import Data.Word (Word8)
+import Foreign (allocaBytes, castPtr, pokeByteOff)
 
+withCString :: MonadUnliftIO m => Text -> (CString -> m a) -> m a
+withCString t@(Text _arr _off len) action =
+  withUnliftIO $ \(UnliftIO unlift) ->
+    allocaBytes (len + 1) $ \buf -> do
+      unsafeCopyToPtr t buf
+      pokeByteOff buf len (0 :: Word8)
+      unlift $ action (castPtr buf)
+
 #else
+-- XXX: the text is UTF-16, let GHC do it
 
 withCString :: MonadUnliftIO m => Text -> (CString -> m a) -> m a
 withCString t action = do
   withUnliftIO $ \(UnliftIO unlift) ->
-    liftIO $
-      Foreign.withCString utf8 (unpack t) $ \textPtr ->
-        unlift $ action textPtr
+    Foreign.withCString utf8 (unpack t) $ \textPtr ->
+      unlift $ action textPtr
 
 #endif
 
diff --git a/src/DearImGui/Raw.hs b/src/DearImGui/Raw.hs
--- a/src/DearImGui/Raw.hs
+++ b/src/DearImGui/Raw.hs
@@ -693,27 +693,27 @@
 
 
 -- | Wraps @ImGui::DragFloat()@
-dragFloat :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> m Bool
-dragFloat descPtr floatPtr speed minValue maxValue = liftIO do
-  (0 /=) <$> [C.exp| bool { DragFloat( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue)) } |]
+dragFloat :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> CString -> m Bool
+dragFloat descPtr floatPtr speed minValue maxValue formatPtr = liftIO do
+  (0 /=) <$> [C.exp| bool { DragFloat( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
 
 
 -- | Wraps @ImGui::DragFloat2()@
-dragFloat2 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> m Bool
-dragFloat2 descPtr floatPtr speed minValue maxValue = liftIO do
-  (0 /=) <$> [C.exp| bool { DragFloat2( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue)) } |]
+dragFloat2 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> CString -> m Bool
+dragFloat2 descPtr floatPtr speed minValue maxValue formatPtr = liftIO do
+  (0 /=) <$> [C.exp| bool { DragFloat2( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
 
 
 -- | Wraps @ImGui::DragFloat3()@
-dragFloat3 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> m Bool
-dragFloat3 descPtr floatPtr speed minValue maxValue = liftIO do
-  (0 /=) <$> [C.exp| bool { DragFloat3( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue)) } |]
+dragFloat3 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> CString -> m Bool
+dragFloat3 descPtr floatPtr speed minValue maxValue formatPtr = liftIO do
+  (0 /=) <$> [C.exp| bool { DragFloat3( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
 
 
 -- | Wraps @ImGui::DragFloat4()@
-dragFloat4 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> m Bool
-dragFloat4 descPtr floatPtr speed minValue maxValue = liftIO do
-  (0 /=) <$> [C.exp| bool { DragFloat4( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue)) } |]
+dragFloat4 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CFloat -> CString -> m Bool
+dragFloat4 descPtr floatPtr speed minValue maxValue formatPtr = liftIO do
+  (0 /=) <$> [C.exp| bool { DragFloat4( $(char* descPtr), $(float* floatPtr), $(float speed), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
 
 
 -- | Wraps @ImGui::DragFloatRange2()@
@@ -853,27 +853,27 @@
     maxPtr_ = castPtr maxPtr
 
 -- | Wraps @ImGui::SliderFloat()@
-sliderFloat :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> m Bool
-sliderFloat descPtr floatPtr minValue maxValue = liftIO do
-  (0 /=) <$> [C.exp| bool { SliderFloat( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue)) } |]
+sliderFloat :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CString -> m Bool
+sliderFloat descPtr floatPtr minValue maxValue formatPtr = liftIO do
+  (0 /=) <$> [C.exp| bool { SliderFloat( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
 
 
 -- | Wraps @ImGui::SliderFloat2()@
-sliderFloat2 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> m Bool
-sliderFloat2 descPtr floatPtr minValue maxValue = liftIO do
-  (0 /=) <$> [C.exp| bool { SliderFloat2( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue)) } |]
+sliderFloat2 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CString -> m Bool
+sliderFloat2 descPtr floatPtr minValue maxValue formatPtr = liftIO do
+  (0 /=) <$> [C.exp| bool { SliderFloat2( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
 
 
 -- | Wraps @ImGui::SliderFloat3()@
-sliderFloat3 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> m Bool
-sliderFloat3 descPtr floatPtr minValue maxValue = liftIO do
-  (0 /=) <$> [C.exp| bool { SliderFloat3( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue)) } |]
+sliderFloat3 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CString -> m Bool
+sliderFloat3 descPtr floatPtr minValue maxValue formatPtr = liftIO do
+  (0 /=) <$> [C.exp| bool { SliderFloat3( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
 
 
 -- | Wraps @ImGui::SliderFloat4()@
-sliderFloat4 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> m Bool
-sliderFloat4 descPtr floatPtr minValue maxValue = liftIO do
-  (0 /=) <$> [C.exp| bool { SliderFloat4( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue)) } |]
+sliderFloat4 :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CString -> m Bool
+sliderFloat4 descPtr floatPtr minValue maxValue formatPtr = liftIO do
+  (0 /=) <$> [C.exp| bool { SliderFloat4( $(char* descPtr), $(float* floatPtr), $(float minValue), $(float maxValue), $(char* formatPtr)) } |]
 
 -- | Wraps @ImGui::SliderAngle()@
 sliderAngle :: (MonadIO m) => CString -> Ptr CFloat -> CFloat -> CFloat -> CString -> ImGuiSliderFlags -> m Bool
