General purpose modules for Roblox development. [Read-only Codeberg mirror]
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

first commit

ClaytonTDM 26a8d9cc

+257
+8
.gitignore
··· 1 + .DS_Store 2 + /Packages 3 + /sourcemap.json 4 + /*.lock 5 + /*.rbxl 6 + /*.rbxlx 7 + /*.rbxm 8 + /*.rbxmx
+14
Demos/ScreenGui/Frame/LocalScript.client.luau
··· 1 + local ReplicatedStorage = game:GetService("ReplicatedStorage") 2 + 3 + local module = require(ReplicatedStorage.TextTransform) 4 + local db = true 5 + 6 + script.Parent.TextButton.MouseButton1Click:Connect(function() 7 + if not db then 8 + return 9 + end 10 + db = false 11 + script.Parent.TextLabel.Text = "Transforming..." 12 + module.TransformText(script.Parent.TextLabel) 13 + script.Parent.TextLabel.Text = "Transformed!" 14 + end)
+20
Demos/ScreenGui/Frame/TextButton/init.meta.json
··· 1 + { 2 + "className": "TextButton", 3 + "properties": { 4 + "AnchorPoint": [0.5, 1], 5 + "BackgroundColor3": [1, 1, 1], 6 + "BorderColor3": [0, 0, 0], 7 + "BorderSizePixel": 0, 8 + "FontFace": { 9 + "family": "rbxasset://fonts/families/SourceSansPro.json", 10 + "weight": "Regular", 11 + "style": "Normal", 12 + "cachedFaceId": null 13 + }, 14 + "Position": [[0.5, 0.0], [0.0, 0.0]], 15 + "Size": [[0.0, 200.0], [0.0, 50.0]], 16 + "Text": "Transform", 17 + "TextColor3": [0, 0, 0], 18 + "TextSize": 14 19 + } 20 + }
+19
Demos/ScreenGui/Frame/TextLabel/init.meta.json
··· 1 + { 2 + "className": "TextLabel", 3 + "properties": { 4 + "BackgroundColor3": [1, 1, 1], 5 + "BorderColor3": [0, 0, 0], 6 + "BorderSizePixel": 0, 7 + "FontFace": { 8 + "family": "rbxasset://fonts/families/SourceSansPro.json", 9 + "weight": "Regular", 10 + "style": "Normal", 11 + "cachedFaceId": null 12 + }, 13 + "Size": [[1.0, 0.0], [1.0, 0.0]], 14 + "Text": "bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! bonjour! ", 15 + "TextColor3": [0, 0, 0], 16 + "TextSize": 14, 17 + "TextWrapped": true 18 + } 19 + }
+11
Demos/ScreenGui/Frame/init.meta.json
··· 1 + { 2 + "className": "Frame", 3 + "properties": { 4 + "AnchorPoint": [0.5, 0.5], 5 + "BackgroundColor3": [1, 1, 1], 6 + "BorderColor3": [0, 0, 0], 7 + "BorderSizePixel": 0, 8 + "Position": [[0.5, 0.0], [0.5, 0.0]], 9 + "Size": [[0.5, 0.0], [0.5, 0.0]] 10 + } 11 + }
+6
Demos/ScreenGui/init.meta.json
··· 1 + { 2 + "className": "ScreenGui", 3 + "properties": { 4 + "ZIndexBehavior": "Sibling" 5 + } 6 + }
+7
Demos/init.meta.json
··· 1 + { 2 + "className": "StarterGui", 3 + "properties": { 4 + "ScreenOrientation": "Sensor" 5 + }, 6 + "keepUnknowns": true 7 + }
+21
LICENSE
··· 1 + MIT License 2 + 3 + Copyright (c) 2025 ClaytonTDM 4 + 5 + Permission is hereby granted, free of charge, to any person obtaining a copy 6 + of this software and associated documentation files (the "Software"), to deal 7 + in the Software without restriction, including without limitation the rights 8 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 + copies of the Software, and to permit persons to whom the Software is 10 + furnished to do so, subject to the following conditions: 11 + 12 + The above copyright notice and this permission notice shall be included in all 13 + copies or substantial portions of the Software. 14 + 15 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 + SOFTWARE.
+127
Modules/TextTransform.luau
··· 1 + --!optimize 2 2 + --!strict 3 + 4 + local module = {} 5 + 6 + local TextService = game:GetService("TextService") 7 + 8 + local X_ALIGNMENT_MAP = { 9 + [Enum.TextXAlignment.Left] = Enum.HorizontalAlignment.Left, 10 + [Enum.TextXAlignment.Center] = Enum.HorizontalAlignment.Center, 11 + [Enum.TextXAlignment.Right] = Enum.HorizontalAlignment.Right, 12 + } 13 + local Y_ALIGNMENT_MAP = { 14 + [Enum.TextYAlignment.Top] = Enum.VerticalAlignment.Top, 15 + [Enum.TextYAlignment.Center] = Enum.VerticalAlignment.Center, 16 + [Enum.TextYAlignment.Bottom] = Enum.VerticalAlignment.Bottom, 17 + } 18 + 19 + -- Transforms a <code>TextLabel</code> into a <code>Frame</code> with many children for easy manipulation of letters. Letter index is stored in <code>LayoutOrder</code> for each <code>Frame</code>. 20 + function module.TransformText(labelToTransform: TextLabel): Frame 21 + local originalText = labelToTransform.Text 22 + local originalSize = labelToTransform.Size 23 + local originalPosition = labelToTransform.Position 24 + local originalAnchorPoint = labelToTransform.AnchorPoint 25 + local originalRotation = labelToTransform.Rotation 26 + local originalParent = labelToTransform.Parent 27 + local originalName = labelToTransform.Name 28 + local originalFontFace = labelToTransform.FontFace 29 + local originalTextSize = labelToTransform.TextSize 30 + local originalTextColor = labelToTransform.TextColor3 31 + local originalTextTransparency = labelToTransform.TextTransparency 32 + local originalTextStrokeColor = labelToTransform.TextStrokeColor3 33 + local originalTextStrokeTransparency = 34 + labelToTransform.TextStrokeTransparency 35 + local originalXAlignment = labelToTransform.TextXAlignment 36 + local originalYAlignment = labelToTransform.TextYAlignment 37 + local originalBackgroundColor3 = labelToTransform.BackgroundColor3 38 + local originalBackgroundTransparency = labelToTransform.BackgroundTransparency 39 + 40 + local listFrame = Instance.new("Frame") 41 + listFrame.Name = originalName 42 + listFrame.Size = originalSize 43 + listFrame.Position = originalPosition 44 + listFrame.AnchorPoint = originalAnchorPoint 45 + listFrame.Rotation = originalRotation 46 + listFrame.BorderSizePixel = 0 47 + listFrame.BackgroundTransparency = 1 48 + listFrame.ClipsDescendants = true 49 + listFrame.BackgroundColor3 = originalBackgroundColor3 50 + listFrame.BackgroundTransparency = originalBackgroundTransparency 51 + 52 + local layout = Instance.new("UIListLayout") 53 + layout.FillDirection = Enum.FillDirection.Horizontal 54 + layout.Wraps = true 55 + layout.HorizontalAlignment = 56 + X_ALIGNMENT_MAP[originalXAlignment] or Enum.HorizontalAlignment.Left 57 + layout.VerticalAlignment = 58 + Y_ALIGNMENT_MAP[originalYAlignment] or Enum.VerticalAlignment.Top 59 + layout.SortOrder = Enum.SortOrder.LayoutOrder 60 + layout.Parent = listFrame -- Parent layout immediately 61 + 62 + local spaceParams = Instance.new("GetTextBoundsParams") 63 + spaceParams.Font = originalFontFace 64 + spaceParams.Size = originalTextSize 65 + spaceParams.Text = " " -- Single space character 66 + local spaceSize: Vector2 = TextService:GetTextBoundsAsync(spaceParams) 67 + 68 + local charParams = Instance.new("GetTextBoundsParams") 69 + charParams.Font = originalFontFace 70 + charParams.Size = originalTextSize 71 + 72 + local textLength = utf8.len(originalText) 73 + local childrenToParent = table.create(textLength) -- Pre-allocate table 74 + local childIndex = 0 75 + 76 + for char in string.gmatch(originalText, ".") do 77 + local charSize: Vector2 78 + local isWhitespace = string.match(char, "%s") 79 + 80 + if isWhitespace then 81 + charSize = spaceSize 82 + else 83 + charParams.Text = char 84 + charSize = TextService:GetTextBoundsAsync(charParams) 85 + end 86 + 87 + local textContainer = Instance.new("Frame") 88 + textContainer.Name = char 89 + textContainer.BackgroundTransparency = 1 90 + textContainer.BorderSizePixel = 0 91 + textContainer.Size = UDim2.fromOffset(charSize.X, charSize.Y) 92 + textContainer.LayoutOrder = childIndex 93 + 94 + if not isWhitespace then 95 + local charLabel = Instance.new("TextLabel") 96 + charLabel.FontFace = originalFontFace 97 + charLabel.TextSize = originalTextSize 98 + charLabel.TextColor3 = originalTextColor 99 + charLabel.TextTransparency = originalTextTransparency 100 + charLabel.TextStrokeColor3 = originalTextStrokeColor 101 + charLabel.TextStrokeTransparency = 102 + originalTextStrokeTransparency 103 + charLabel.BackgroundTransparency = 1 104 + charLabel.Size = UDim2.fromScale(1, 1) 105 + charLabel.Text = char 106 + charLabel.TextXAlignment = originalXAlignment 107 + charLabel.TextYAlignment = Enum.TextYAlignment.Center 108 + charLabel.Parent = textContainer 109 + end 110 + 111 + childIndex += 1 112 + childrenToParent[childIndex] = textContainer 113 + end 114 + 115 + for i = 1, childIndex do 116 + childrenToParent[i].Parent = listFrame 117 + end 118 + 119 + table.clear(childrenToParent) 120 + 121 + listFrame.Parent = originalParent 122 + labelToTransform:Destroy() 123 + 124 + return listFrame 125 + end 126 + 127 + return module
+12
README.md
··· 1 + # Roblox Modules 2 + 3 + General purpose modules for Roblox development. These modules are designed to be reusable and can be easily integrated into your Roblox projects. 4 + 5 + - TextTransform 6 + - Transforms a `TextLabel` into a `Frame` with many children for easy manipulation of letters. Letter index is stored in `LayoutOrder` for each `Frame`. 7 + 8 + --- 9 + 10 + ## Building 11 + 12 + This project was built using [Argon](https://argon.wiki/), which is similar to Rojo. See [Argon](https://argon.wiki/) for more information on how to install and use it.
+12
default.project.json
··· 1 + { 2 + "name": "robloxModules", 3 + "tree": { 4 + "$className": "DataModel", 5 + "ReplicatedStorage": { 6 + "$path": "Modules" 7 + }, 8 + "StarterGui": { 9 + "$path": "Demos" 10 + } 11 + } 12 + }