diff --git a/clay.h b/clay.h
index 7904235..c28dd53 100644
--- a/clay.h
+++ b/clay.h
@@ -64,9 +64,13 @@
 
 #define CLAY_SIZING_PERCENT(percentOfParent) (Clay_SizingAxis) { .type = CLAY__SIZING_TYPE_PERCENT, .sizePercent = (percentOfParent) }
 
-#define CLAY_ID(label) Clay__HashString(CLAY_STRING(label), 0)
+#define CLAY_ID(label) Clay__HashString(CLAY_STRING(label), 0, 0)
 
-#define CLAY_IDI(label, index) Clay__HashString(CLAY_STRING(label), index)
+#define CLAY_IDI(label, index) Clay__HashString(CLAY_STRING(label), index, 0)
+
+#define CLAY_LOCAL_ID(label) CLAY_LOCAL_IDI(label, 0)
+
+#define CLAY_LOCAL_IDI(label, index) Clay__HashString(CLAY_STRING(label), index, Clay__GetParentId())
 
 #define CLAY_ID_AUTO (Clay_ElementId) { .stringId = CLAY_STRING("Auto Generated ID"), .id = Clay__RehashWithNumber(Clay__dynamicElementIndexBaseHash.id, Clay__dynamicElementIndex++) }
 
@@ -415,7 +419,8 @@ Clay_FloatingElementConfig * Clay__StoreFloatingElementConfig(Clay_FloatingEleme
 Clay_CustomElementConfig * Clay__StoreCustomElementConfig(Clay_CustomElementConfig config);
 Clay_ScrollElementConfig * Clay__StoreScrollElementConfig(Clay_ScrollElementConfig config);
 Clay_BorderElementConfig * Clay__StoreBorderElementConfig(Clay_BorderElementConfig config);
-Clay_ElementId Clay__HashString(Clay_String key, uint32_t offset);
+Clay_ElementId Clay__HashString(Clay_String key, uint32_t offset, uint32_t seed);
+uint32_t Clay__GetParentId(void);
 
 extern Clay_Color Clay__debugViewHighlightColor;
 extern uint32_t Clay__debugViewWidth;
@@ -1355,9 +1360,9 @@ Clay__DebugElementDataArray Clay__debugElementData;
 
 Clay_String LAST_HASH;
 
-Clay_ElementId Clay__HashString(Clay_String key, const uint32_t offset) {
+Clay_ElementId Clay__HashString(Clay_String key, const uint32_t offset, const uint32_t seed) {
     uint32_t hash = 0;
-    uint32_t base = 0;
+    uint32_t base = seed;
 
     for (int i = 0; i < key.length; i++) {
         base += key.chars[i];
@@ -1382,6 +1387,10 @@ Clay_ElementId Clay__HashString(Clay_String key, const uint32_t offset) {
     return (Clay_ElementId) { .stringId = key, .id = hash + 1, .offset = offset, .baseId = base + 1 }; // Reserve the hash result of zero as "null id"
 }
 
+uint32_t Clay__GetParentId(void) {
+    return Clay__openLayoutElement ? Clay__openLayoutElement->id : 0;
+}
+
 Clay_ElementId Clay__Rehash(Clay_ElementId elementId, uint32_t number) {
     uint32_t id = elementId.baseId;
     id += number;