image# Components Vide encourages separating different parts of your UI into functions called *components*. A component is a function that creates and returns a piece of UI. This is a way to separate your UI into small chunks that you can reuse and put together. ::: code-group ```luau [Button.luau] local create = vide.create local function Button(props: { Position: UDim2, Text: string, Activated: () -> () }) return create "TextButton" { BackgroundColor3 = Color3.fromRGB(50, 50, 50), TextColor3 = Color3.fromRGB(255, 255, 255), Size = UDim2.fromOffset(200, 150), Position = props.Position, Text = props.Text, Activated = props.Activated, create "UICorner" {} } end return Button ``` ```luau [Menu.luau] local create = vide.create local source = vide.source local effect = vide.effect local Button = require(Button) local Slider = require(Slider) local fov = source(70) effect(function() local cam = workspace.CurrentCamera if cam then cam.FieldOfView = fov() end end) local function Menu() return create "ScreenGui" { Button { Position = UDim2.fromOffset(200, 200), Text = "back", Activated = function() print "go to previous page" end }, Button { Position = UDim2.fromOffset(400, 200), Text = "next", Activated = function() print "go to next page" end }, -- Settings menu panel (example usage of Slider component) create "Frame" { AnchorPoint = Vector2.new(0, 1), Position = UDim2.fromOffset(24, 560), Size = UDim2.fromOffset(560, 220), BackgroundTransparency = 0.1, create "UICorner" { CornerRadius = UDim.new(0, 16) }, create "UIPadding" { PaddingTop = UDim.new(0, 16), PaddingBottom = UDim.new(0, 16), PaddingLeft = UDim.new(0, 16), PaddingRight = UDim.new(0, 16), }, create "UIListLayout" { Padding = UDim.new(0, 14), HorizontalAlignment = Enum.HorizontalAlignment.Center, SortOrder = Enum.SortOrder.LayoutOrder, }, create "TextLabel" { LayoutOrder = 0, BackgroundTransparency = 1, Size = UDim2.fromOffset(528, 28), TextXAlignment = Enum.TextXAlignment.Left, TextSize = 20, Text = "Settings", }, Slider { layoutOrder = 1, label = "Camera FOV", min = 60, max = 90, step = 1, value = fov, format = function(v) return string.format("%d", math.floor(v + 0.5)) end, }, }, } end return Menu ``` ```luau [slider.luau] -- Example of a component that wraps the built-in slider component. -- This keeps a consistent "component(props) -> Instance" style. local source = vide.source export type SliderTheme = { trackColor: Color3?, trackTransparency: number?, fillColor: Color3?, fillTransparency: number?, knobColor: Color3?, knobTransparency: number?, strokeColor: Color3?, strokeTransparency: number?, cornerRadius: number?, knobRadius: number?, } export type SliderProps = { -- required value: source.source, -- range min: number?, max: number?, step: number?, -- text label: string?, format: ((number) -> string)?, onChanged: ((number) -> ())?, -- layout size: UDim2?, position: UDim2?, anchorPoint: Vector2?, layoutOrder: number?, -- style theme: SliderTheme?, } local function Slider(props: SliderProps) return vide.slider(props) end return Slider ::: A single parameter `props` is used to pass properties to the component.