I uploaded this texture to roblox and on the website its fine there is no black leaking on the top and white on the bottom.
When I use this texture on a Texture or MaterialVariant it leaks past its bounds on the top and bottom. This is not an issue with Decals. See the images below
This is really annoying because what if you want to flip a part 180 and keep the white seamless texture except for you cant because this happens with Textures and MaterialVariants but not Decals:
This is currently working as designed. Decals set their texture addressing mode to clamp, whereas Texture and MaterialService set their textures to wrap. (for more information about addressing modes see: LearnOpenGL - Textures)
This is because Texture and MaterialService allow the texture to be tiled, whereas decals do not. Setting the mode to clamp in a scenarios where the texture was supposed to be tiled looks wrong:
You are right about textures looping as intended but this is an issue with the compression system causing the texture to bleed 1 pixel over the image bounds causing white or black to appear at the top.
When the texture is sampled while drawing the geometry, because the texture is smaller than what it’s being drawn onto, the engine interpolates between pixel colors so the individual pixels in the texture are not visible. This produces a smooth gradient between pixel colors that you normally don’t notice.
When the pixel color is sampled across the boundary of the texture into where it would wrap, this interpolation is still happening, producing the black gradient that you see.
The only way to prevent this for this case is to use a decal, shrink the part the texture is applied to so the seam is not visible, or design the image so this bottom seam being visible at the top is not an issue.