- Expressive API
- Highly performant
- No dependencies
- Ability to nest styles
- Auto-detects color support
- Clean and focused
- Actively maintained
- Extremely Lightweight (less than ~270 lines)
- Proper Typing for AutoFill
Roblox Console
-- Run in Roblox Studio Console
local HttpService = game:GetService("HttpService");
local ReplicatedStorage = game:GetService("ReplicatedStorage");
local LastValue = HttpService.HttpEnabled
HttpService.HttpEnabled = true
local ChalkModule = Instance.new("ModuleScript");
ChalkModule.Name = "Chalk";
ChalkModule.Parent = ReplicatedStorage;
local Request = HttpService:RequestAsync({
Url = "https://raw.githubusercontent.com/Perthys/chalk/refs/heads/main/src/main.luau";
Method = "GET";
});
HttpService.HttpEnabled = LastValue
if Request.Success and Request.StatusCode == 200 then
ChalkModule.Source = Request.Body
print("Successfully installed Chalk module. At:", ChalkModule);
else
ChalkModule:Destroy()
error("Failed to install Chalk module.");
endWally
[dependencies]
chalk = "perthys/[email protected]"Blue Text Example
Chalk has a very simple but powerful API
local ReplicatedStorage = game:GetService("ReplicatedStorage");
local Chalk = require(ReplicatedStorage:WaitForChild("Chalk"));
local TextBox = script.Parent;
TextBox.Text = Chalk.blue('Hello world!')Multi String Example
Chalk comes with an easy to use composable API where you just chain and nest the styles you want.
local ReplicatedStorage = game:GetService("ReplicatedStorage");
local Chalk = require(ReplicatedStorage:WaitForChild("Chalk"));
local TextBox = script.Parent; TextBox.RichText = true;
local function Update(String) TextBox.Text = String; task.wait(1); end
Update(Chalk.blue("Hello") .. 'World' .. Chalk.red("!"))
Update(Chalk.blue.bold("Hello world!"))
Update(Chalk.blue("Hello", "World!", "Foo", "bar", "biz", "baz"))
Update(Chalk.red("Hello", Chalk.underline("world") .. "!"))
Update(Chalk.green("I am a green line " .. Chalk.blue.underline.bold("with a blue substring") .. " that becomes green again!"))
Update(("CPU: %s \nRAM: %s \nDISK: %s"):format(Chalk.red("90%"), Chalk.green("40%"), Chalk.yellow("70%")))
Update(Chalk.color(123, 45, 67).underline("Underlined reddish color"))
Update(Chalk.color("#DEADED").bold("Bold gray!"))Theme Creation
Easily define your own themes
local ReplicatedStorage = game:GetService("ReplicatedStorage");
local Chalk = require(ReplicatedStorage:WaitForChild("Chalk"));
local TextBox = script.Parent; TextBox.RichText = true;
local error = Chalk.bold.red;
local warning = Chalk.color("#FFA500");
local function Update(String) TextBox.Text = String; task.wait(1); end
Update(error("Error!"))
Update(warning("Warning!"));Take advantage of string substitution:
local ReplicatedStorage = game:GetService("ReplicatedStorage");
local Chalk = require(ReplicatedStorage:WaitForChild("Chalk"));
local TextBox = script.Parent; TextBox.RichText = true;
local function Update(String) TextBox.Text = String; task.wait(1); end
local Name = "Builderman";
Update(Chalk.green(("Hello %s"):format(Name)))Example:
chalk[ ArgumentStyle ] -> (...: StyleArgs) -> chalk(...: string)
chalk.size(40)("test");
chalk[ ModifierStyle ] -> chalk(...: string)
chalk.bold("test");
chalk[ ArgumentStyle ] -> (...: StyleArgs) -> chalk[ ArgumentStyle ] -> (...) -> chalk(...: string)
chalk.size(40).color(40,20,30)("test");
chalk[ ArgumentStyle ] -> (...: StyleArgs) -> chalk[ ModifierStyle ] -> chalk(...: string)
chalk.size(40).bold("test");
chalk[ ModifierStyle ] -> chalk[ ModifierStyle ] -> chalk(...: string)
chalk.red.bold("test");
chalk[ ModifierStyle ] -> chalk[ ArgumentStyle ] -> (...: StyleArgs) -> chalk(...: string)
chalk.red.size(40)("test");Chain styles calls the last Style as a method with a string argument.
Order doesn't matter, and earlier Styles take priority in case of a conflict.
This simply means that chalk.red.yellow.green is equivalent to chalk.red.
Chalk.bold- Make the text boldChalk.italic- Make the text italicChalk.underline- Underline the textChalk.strikethrough- Strike through the textChalk.uppercase- Convert text to uppercaseChalk.smallcaps- Convert text to small capitals
Chalk.color(Hex) | Chalk.color(R, G, B) | Chalk.color(Color3.new())- Set the colorChalk.size([<Size>])- Set the size of the text (Number)Chalk.face([<Face>])- Set the typeface of the text (String)Chalk.family([<rbxasset://>])- Set the font family from an asset (String)Chalk.weight([<Weight>])- Set the font weight (String)Chalk.transparency([<Transparency>])- Set the transparency of the text (Number 0-1)Chalk.stroke({Color = [<Color>], Joins = [<Joins>], Thickness = [<Thickness>], Transparency = [<Transparency>]})- Define stroke properties: color (Color3), joins (String), thickness (Number), and transparency (Number)
Chalk.stroke({
Color = [<Color>],
Joins = [<Joins>],
Thickness = [<Thickness>],
Transparency = [<Transparency>]
})Chalk[<BrickColorName>]- Set the color to a BrickColorColorsChalk.white- Set the color to whiteChalk.black- Set the color to blackChalk.red- Set the color to redChalk.brown- Set the color to brownChalk.orange- Set the color to orangeChalk.yellow- Set the color to yellowChalk.lime- Set the color to limeChalk.green- Set the color to greenChalk.blue- Set the color to blueChalk.purple- Set the color to purpleChalk.pink- Set the color to pink
Chalk supports Color3, 256 RGB, Hex and BrickColor.
Examples:
Chalk.color('#DEADED').underline('Hello, world!')Chalk.color(15, 100, 204)Chalk.color(Color3.fromRGB(100, 255, 255))Chalk.nougat
The following color models can be used:
rgb- Example:chalk.color(255, 136, 0).bold('Orange!')hex- Example:chalk.color('#FF8800').bold('Orange!')Color3- Example:chalk.color(Color3.fromRGB(255, 136, 0)).bold("Orange")BrickColor- Examplechalk["Earth orange"]
I wanted to make the npm package chalk for roblox luau richtext because I really did not want to do styling manually.
- ROBLOX PLEASE ENABLE RICH TEXT TO CONSOLE TEXT OBJECTS, you can make a interface with LogService so print/warn/error can still output raw text.
- If roblox adds support for background text color directly with richtext I will also add support.
- If you have any issues or suggestions best way to contact me would be through discord
Perthys#0.
- Perth |
Perthys#0