Run it
Copy the script and paste it into your executor.
TweenService = :()
UserInputService = :()
TextService = :()
Players = :()
(className, properties)
instance = .(className)
property, value (properties)
instance[property] = value
instance
Theme = {
Background = .(, , ),
Elevated = .(, , ),
Text = .(, , ),
TextSecondary = .(, , ),
Accent = .(, , ),
Border = .(, , ),
Hover = .(, , ),
Font = .Font.Gotham,
TitleFont = .Font.GothamBold,
Padding = ,
CornerRadius = ,
UIScale =
}
Janitor = {}
Janitor.__index = Janitor
Janitor.()
({_tasks = {}}, Janitor)
Janitor:()
.(self._tasks, )
Janitor:()
_, (self._tasks)
() ==
()
() ==
:()
() ==
:()
self._tasks = {}
Signal = {}
Signal.__index = Signal
Signal.()
({_connections = {}}, Signal)
Signal:(callback)
connection = {Connected = }
connection.Disconnect = ()
connection.Connected =
i, conn (self._connections)
conn == connection
.(self._connections, i)
connection.Callback = callback
.(self._connections, connection)
connection
Signal:(...)
_, connection (self._connections)
connection.Connected
.(connection.Callback, ...)
Paragraph = {}
Paragraph.__index = Paragraph
Paragraph.(config)
self = ({}, Paragraph)
self._janitor = Janitor.()
self.OnClose = Signal.()
self._isVisible =
self._title = config.Title
self._content = config.Content
self._width = config.Width
self._maxHeight = config.MaxHeight
self:(config)
self:()
self
Paragraph:(config)
self.Container = self._janitor:((, {
Size = .(, self._width, , ),
Position = .(, , , ),
AnchorPoint = .(, ),
BackgroundColor3 = Theme.Elevated,
BorderSizePixel = ,
Parent = config.Parent Players.LocalPlayer:():() (, {Parent = Players.LocalPlayer:()})
}))
(, {
CornerRadius = .(, Theme.CornerRadius),
Parent = self.Container
})
(, {
Color = Theme.Border,
Thickness = ,
Parent = self.Container
})
(, {
Scale = Theme.UIScale,
Parent = self.Container
})
self.Header = (, {
Size = .(, , , ),
BackgroundColor3 = Theme.Background,
BorderSizePixel = ,
Parent = self.Container
})
(, {
CornerRadius = .(, Theme.CornerRadius),
Parent = self.Header
})
self.TitleLabel = (, {
Size = .(, -, , ),
Position = .(, Theme.Padding, , ),
BackgroundTransparency = ,
Text = self._title,
TextColor3 = Theme.Text,
Font = Theme.TitleFont,
TextSize = ,
TextXAlignment = .TextXAlignment.Left,
TextYAlignment = .TextYAlignment.Center,
Parent = self.Header
})
self.CloseButton = (, {
Size = .(, , , ),
Position = .(, -, , ),
AnchorPoint = .(, ),
BackgroundColor3 = Theme.Background,
BackgroundTransparency = ,
Text = ,
TextColor3 = Theme.TextSecondary,
Font = Theme.Font,
TextSize = ,
Parent = self.Header
})
(, {
CornerRadius = .(, ),
Parent = self.CloseButton
})
self.ContentFrame = (, {
Size = .(, -, , -),
Position = .(, , , ),
BackgroundTransparency = ,
BorderSizePixel = ,
ScrollBarThickness = ,
ScrollBarImageColor3 = Theme.Border,
CanvasSize = .(, , , ),
AutomaticCanvasSize = .AutomaticSize.Y,
Parent = self.Container
})
self.ContentLabel = (, {
Size = .(, -, , ),
AutomaticSize = .AutomaticSize.Y,
BackgroundTransparency = ,
Text = self._content,
TextColor3 = Theme.Text,
Font = Theme.Font,
TextSize = ,
TextXAlignment = .TextXAlignment.Left,
TextYAlignment = .TextYAlignment.Top,
TextWrapped = ,
RichText = ,
LineHeight = ,
Parent = self.ContentFrame
})
(, {
PaddingLeft = .(, ),
PaddingRight = .(, ),
PaddingTop = .(, ),
PaddingBottom = .(, ),
Parent = self.ContentFrame
})
.()
self:()
Paragraph:()
contentHeight = self.ContentLabel.AbsoluteSize.Y +
finalHeight = .(contentHeight, self._maxHeight)
TweenService:(self.Container, TweenInfo.(, .EasingStyle.Quad, .EasingDirection.Out), {
Size = .(, self._width, , finalHeight)
}):()
Paragraph:()
hoverTween
self._janitor:(self.CloseButton.MouseEnter:(()
hoverTween hoverTween:()
hoverTween = TweenService:(self.CloseButton, TweenInfo.(, .EasingStyle.Quad), {
BackgroundTransparency = ,
BackgroundColor3 = Theme.Hover,
TextColor3 = Theme.Text
})
hoverTween:()
))
self._janitor:(self.CloseButton.MouseLeave:(()
hoverTween hoverTween:()
hoverTween = TweenService:(self.CloseButton, TweenInfo.(, .EasingStyle.Quad), {
BackgroundTransparency = ,
TextColor3 = Theme.TextSecondary
})
hoverTween:()
))
self._janitor:(self.CloseButton.MouseButton1Click:(()
self:()
))
self:()
Paragraph:()
dragging, dragInput, dragStart, startPos
self._janitor:(self.Header.InputBegan:((input)
input.UserInputType == .UserInputType.MouseButton1 input.UserInputType == .UserInputType.Touch
dragging =
dragStart = input.Position
startPos = self.Container.Position
input.Changed:(()
input.UserInputState == .UserInputState.End
dragging =
)
))
self._janitor:(self.Header.InputChanged:((input)
input.UserInputType == .UserInputType.MouseMovement input.UserInputType == .UserInputType.Touch
dragInput = input
))
self._janitor:(UserInputService.InputChanged:((input)
input == dragInput dragging
delta = input.Position - dragStart
self.Container.Position = .(
startPos.X.Scale,
startPos.X.Offset + delta.X,
startPos.Y.Scale,
startPos.Y.Offset + delta.Y
)
))
Paragraph:(newTitle)
self._title = newTitle
self.TitleLabel.Text = newTitle
TweenService:(self.TitleLabel, TweenInfo.(, .EasingStyle.Quad), {
TextColor3 = Theme.Accent
}):()
.(, ()
TweenService:(self.TitleLabel, TweenInfo.(, .EasingStyle.Quad), {
TextColor3 = Theme.Text
}):()
)
Paragraph:(newContent)
self._content = newContent
self.ContentLabel.Text = newContent
.()
self:()
Paragraph:()
self._isVisible = self._isVisible
self.Container.Visible = self._isVisible
self._isVisible
self:()
Paragraph:()
self._isVisible =
self.Container.Visible =
self:()
Paragraph:()
self.Container.Size = .(, self._width, , )
contentHeight = self.ContentLabel.AbsoluteSize.Y +
finalHeight = .(contentHeight, self._maxHeight)
TweenService:(self.Container, TweenInfo.(, .EasingStyle.Back, .EasingDirection.Out), {
Size = .(, self._width, , finalHeight)
}):()
Paragraph:()
tween = TweenService:(self.Container, TweenInfo.(, .EasingStyle.Quad, .EasingDirection.In), {
Size = .(, self._width, , )
})
tween:()
tween.Completed:(()
self._isVisible =
self.Container.Visible =
self.OnClose:()
)
Paragraph:()
self._janitor:()
screenGui = (, {
Parent = Players.LocalPlayer:(),
ResetOnSpawn =
})
exampleContent =
paragraph = Paragraph.({
Parent = screenGui,
Title = ,
Content = exampleContent,
Width = ,
MaxHeight =
})
paragraph.OnClose:(()
()
)
UserInputService.InputBegan:((input, gameProcessed)
gameProcessed input.KeyCode == .KeyCode.P
paragraph:()
)
.(, ()
paragraph:()
paragraph:()
)Execute to see the features

Universal