--!strict
local _Package = script.Parent.Parent.Parent.Parent
local _Packages = _Package.Parent
-- Services

-- Packages
local Maid = require(_Packages:WaitForChild("Maid"))
local ColdFusion = require(_Packages:WaitForChild("ColdFusion"))

-- Modules
local Sounds = require(_Package:WaitForChild("Sounds"))
local Enums = require(_Package:WaitForChild("Enums"))
local Types = require(_Package:WaitForChild("Types"))
local Base = require(script.Parent.Parent:WaitForChild("Base"))
local Style = require(_Package:WaitForChild("Style"))
local Theme = require(_Package:WaitForChild("Theme"))

-- Types
type Maid = Maid.Maid
type State<V> = ColdFusion.State<V>
type ValueState<V> = ColdFusion.ValueState<V>
type CanBeState<V> = ColdFusion.CanBeState<V>
type RenderData = Types.RenderData
type Style = Style.Style
type ImageData = Types.ImageData
type FontData = Types.FontData

-- Constants
local DEFAULTS = require(script.Parent:WaitForChild("Defaults"))
-- Variables
-- References
-- Private Functions

-- Class
local Interface = {}

-- Private Functions
function newThemedComponent(
	themeDefaults: typeof(DEFAULTS.ON_PRIMARY),
	textColor: Enums.ColorRoleType,
	disabledTextColor: Enums.ColorRoleType,
	onClick: CanBeState<() -> ()>,
	text: CanBeState<string>,
	icon: CanBeState<ImageData?>,
	style: CanBeState<Style>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	local maid = Maid.new()

	local _fuse = ColdFusion.fuse(maid)

	local _new = _fuse.new
	local _bind = _fuse.bind
	local _clone = _fuse.clone
	local _import = _fuse.import

	local _Value = _fuse.Value
	local _Computed = _fuse.Computed

	local styleState: State<Style> = _import(style, themeDefaults.STYLE)

	local out = Interface.new(
		_import(onClick, themeDefaults.ON_CLICK),
		_import(text, themeDefaults.TEXT),
		_import(icon, themeDefaults.ICON),
		_Computed(function(s: Style): Color3
			return s:GetColor(textColor)
		end, styleState),
		_Computed(function(s: Style): Color3
			return s:GetColor(disabledTextColor)
		end, styleState),
		_import(isEnabled, themeDefaults.IS_ENABLED),
		_import(elevation, themeDefaults.ELEVATION),
		_Computed(function(s: Style): any
			return s.SchemeType
		end, styleState),
		_Computed(function(s: Style): FontData
			return s:GetFontData(Enums.FontType.LabelLarge)
		end, styleState),
		_Computed(function(s: Style): number
			return s.Scale
		end, styleState)
	)

	maid:GiveTask(out.Destroying:Connect(function()
		maid:Destroy()
	end))

	return out
end

Interface = {}

function Interface.onPrimary(
	style: CanBeState<Style>,
	onClick: CanBeState<() -> ()>,
	text: CanBeState<string>,
	icon: CanBeState<ImageData?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.ON_PRIMARY,
		Enums.ColorRoleType.OnPrimary,
		Enums.ColorRoleType.SurfaceVariant,
		onClick,
		text,
		icon,
		style,
		elevation,
		isEnabled
	)
end

function Interface.onSecondary(
	style: CanBeState<Style>,
	onClick: CanBeState<() -> ()>,
	text: CanBeState<string>,
	icon: CanBeState<ImageData?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.ON_SECONDARY,
		Enums.ColorRoleType.OnSecondary,
		Enums.ColorRoleType.SurfaceVariant,
		onClick,
		text,
		icon,
		style,
		elevation,
		isEnabled
	)
end

function Interface.onTertiary(
	style: CanBeState<Style>,
	onClick: CanBeState<() -> ()>,
	text: CanBeState<string>,
	icon: CanBeState<ImageData?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.ON_TERTIARY,
		Enums.ColorRoleType.OnTertiary,
		Enums.ColorRoleType.SurfaceVariant,
		onClick,
		text,
		icon,
		style,
		elevation,
		isEnabled
	)
end

function Interface.onPrimaryContainer(
	style: CanBeState<Style>,
	onClick: CanBeState<() -> ()>,
	text: CanBeState<string>,
	icon: CanBeState<ImageData?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.ON_PRIMARY_CONTAINER,
		Enums.ColorRoleType.OnPrimaryContainer,
		Enums.ColorRoleType.Primary,
		onClick,
		text,
		icon,
		style,
		elevation,
		isEnabled
	)
end

function Interface.onSecondaryContainer(
	style: CanBeState<Style>,
	onClick: CanBeState<() -> ()>,
	text: CanBeState<string>,
	icon: CanBeState<ImageData?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.ON_SECONDARY_CONTAINER,
		Enums.ColorRoleType.OnSecondaryContainer,
		Enums.ColorRoleType.Secondary,
		onClick,
		text,
		icon,
		style,
		elevation,
		isEnabled
	)
end

function Interface.onTertiaryContainer(
	style: CanBeState<Style>,
	onClick: CanBeState<() -> ()>,
	text: CanBeState<string>,
	icon: CanBeState<ImageData?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.ON_TERTIARY_CONTAINER,
		Enums.ColorRoleType.OnTertiaryContainer,
		Enums.ColorRoleType.Tertiary,
		onClick,
		text,
		icon,
		style,
		elevation,
		isEnabled
	)
end

function Interface.new(
	onClick: CanBeState<() -> ()>,
	text: CanBeState<string>,
	icon: CanBeState<ImageData?>,
	textColor: CanBeState<Color3>,
	disabledTextColor: CanBeState<Color3>,
	isEnabled: CanBeState<boolean>,
	elevation: CanBeState<number>,
	schemeType: CanBeState<Enums.SchemeType>,
	fontData: CanBeState<FontData>,
	scale: CanBeState<number>
): GuiObject
	local maid = Maid.new()

	local _fuse = ColdFusion.fuse(maid)

	local _new = _fuse.new
	local _bind = _fuse.bind
	local _clone = _fuse.clone
	local _import = _fuse.import

	local _Value = _fuse.Value
	local _Computed = _fuse.Computed

	local scaleState: State<number> = _import(scale, DEFAULTS.NEW.SCALE)
	local schemeTypeState: State<Enums.SchemeType> = _import(schemeType, DEFAULTS.NEW.SCHEME_TYPE)
	local fontDataState: State<FontData> = _import(fontData, DEFAULTS.NEW.FONT_DATA)
	local elevationState: State<number> = _import(elevation, DEFAULTS.NEW.ELEVATION)

	local textColorState: State<Color3> = _import(textColor, DEFAULTS.NEW.TEXT_COLOR)
	local hoverColorState: State<Color3> = _import(textColor, DEFAULTS.NEW.TEXT_COLOR)

	local disabledTextColorState: State<Color3> = _import(disabledTextColor, DEFAULTS.NEW.DISABLED_TEXT_COLOR)
	local disabledHoverColorState: State<Color3> =
		_import(disabledTextColor, DEFAULTS.NEW.DISABLED_TEXT_COLOR)

	local iconState: State<ImageData?> = _import(icon, DEFAULTS.NEW.ICON)

	local button = Base.new(
		maid,
		_import(onClick, DEFAULTS.NEW.ON_CLICK),
		_import(text, DEFAULTS.NEW.TEXT),
		_import(isEnabled, DEFAULTS.NEW.IS_ENABLED),
		_Computed(
			function(
				st: Enums.SchemeType,
				sc: number,
				f: FontData,
				e: number,
				tC: Color3,
				sC: Color3,
				dTC: Color3,
				dSC: Color3,
				i: ImageData?
			): { [Enums.ButtonStateType]: RenderData }
				e += 1
				return {
					[Enums.ButtonStateType.Enabled] = Types._RenderData.new(
						sc,
						Types._AppearanceData.new(Theme.getElevatedColor(sC, e, st), 1),
						Types._AppearanceData.new(Theme.getElevatedColor(sC, e, st), 1),
						Types._AppearanceData.new(Theme.getElevatedColor(tC, e, st), 0),
						f,
						i,
						nil,
						nil
					),
					[Enums.ButtonStateType.Disabled] = Types._RenderData.new(
						sc,
						Types._AppearanceData.new(Theme.getElevatedColor(dSC, e, st), 1),
						Types._AppearanceData.new(Theme.getElevatedColor(dSC, e, st), 1),
						Types._AppearanceData.new(Theme.getElevatedColor(dTC, e, st), 1 - 0.38),
						f,
						i,
						nil,
						nil
					),
					[Enums.ButtonStateType.Hovered] = Types._RenderData.new(
						sc,
						Types._AppearanceData.new(Theme.getElevatedColor(sC, e, st), 0),
						Types._AppearanceData.new(Theme.getElevatedColor(sC, e + 1, st), 1 - 0.08),
						Types._AppearanceData.new(Theme.getElevatedColor(tC, e + 1, st), 0),
						f,
						i,
						nil,
						nil
					),
					[Enums.ButtonStateType.Focused] = Types._RenderData.new(
						sc,
						Types._AppearanceData.new(Theme.getElevatedColor(sC, e, st), 0),
						Types._AppearanceData.new(Theme.getElevatedColor(sC, e, st), 1 - 0.1),
						Types._AppearanceData.new(Theme.getElevatedColor(tC, e, st), 0),
						f,
						i,
						nil,
						nil
					),
					[Enums.ButtonStateType.Pressed] = Types._RenderData.new(
						sc,
						Types._AppearanceData.new(Theme.getElevatedColor(sC, e, st), 1),
						Types._AppearanceData.new(Theme.getElevatedColor(sC, e - 1, st), 1 - 0.1),
						Types._AppearanceData.new(Theme.getElevatedColor(tC, e - 1, st), 0),
						f,
						i,
						Types._SoundData.new(Sounds.Library[Enums.SoundType.ui_tap_variant_01], 1),
						nil
					),
				}
			end,
			schemeTypeState,
			scaleState,
			fontDataState,
			elevationState,
			textColorState,
			hoverColorState,
			disabledTextColorState,
			disabledHoverColorState,
			iconState
		),
		nil,
		nil,
		nil,
		nil
	)
	maid:GiveTask(button.Destroying:Connect(function()
		maid:Destroy()
	end))

	return button
end

return Interface


--!strict
-- this script was generated by the build system, please do not make manual edits
local _Package = script.Parent.Parent.Parent.Parent
local _Packages = _Package.Parent
-- Services
-- Packages
local Maid = require(_Packages:WaitForChild("Maid"))
local ColdFusion = require(_Packages:WaitForChild("ColdFusion"))

local React = require(_Packages:WaitForChild("React"))
local ReactRoblox = require(_Packages:WaitForChild("ReactRoblox"))

-- Modules
local Types = require(_Package:WaitForChild("Types"))
local Style = require(_Package:WaitForChild("Style"))

local Source = require(script.Parent:WaitForChild("ColdFusion"))

-- Types
type Maid = Maid.Maid
type Style = Style.Style
type FontData = Types.FontData
type OptionData = Types.OptionData
type ButtonData = Types.ButtonData
type ImageData = Types.ImageData
type CanBeState<V> = ColdFusion.CanBeState<V>
-- Constants
local DEFAULTS = require(script.Parent:WaitForChild("Defaults"))
-- Variables
-- References
-- Private Functions
-- Class
local Interface = {}

do
	local NewButtonTextButton = React.Component:extend("NewButtonTextButton")
	NewButtonTextButton.defaultProps = {
		onClick = DEFAULTS.NEW.ON_CLICK,
		text = DEFAULTS.NEW.TEXT,
		icon = DEFAULTS.NEW.ICON,
		textColor = DEFAULTS.NEW.TEXT_COLOR,
		disabledTextColor = DEFAULTS.NEW.DISABLED_TEXT_COLOR,
		isEnabled = DEFAULTS.NEW.IS_ENABLED,
		elevation = DEFAULTS.NEW.ELEVATION,
		schemeType = DEFAULTS.NEW.SCHEME_TYPE,
		fontData = DEFAULTS.NEW.FONT_DATA,
		scale = DEFAULTS.NEW.SCALE,
	}
	function NewButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			textColor = _Value(self.defaultProps.textColor),
			disabledTextColor = _Value(self.defaultProps.disabledTextColor),
			isEnabled = _Value(self.defaultProps.isEnabled),
			elevation = _Value(self.defaultProps.elevation),
			schemeType = _Value(self.defaultProps.schemeType),
			fontData = _Value(self.defaultProps.fontData),
			scale = _Value(self.defaultProps.scale),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.new(
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.textColor,
			self._internalStates.disabledTextColor,
			self._internalStates.isEnabled,
			self._internalStates.elevation,
			self._internalStates.schemeType,
			self._internalStates.fontData,
			self._internalStates.scale
		)
	end

	function NewButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return React.createElement(ReactRoblox.createPortal, props)
	end
	function NewButtonTextButton:componentDidMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function NewButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.New = NewButtonTextButton
end

do
	local OnPrimaryButtonTextButton = React.Component:extend("OnPrimaryButtonTextButton")
	OnPrimaryButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_PRIMARY.STYLE,
		onClick = DEFAULTS.ON_PRIMARY.ON_CLICK,
		text = DEFAULTS.ON_PRIMARY.TEXT,
		icon = DEFAULTS.ON_PRIMARY.ICON,
		elevation = DEFAULTS.ON_PRIMARY.ELEVATION,
		isEnabled = DEFAULTS.ON_PRIMARY.IS_ENABLED,
	}
	function OnPrimaryButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onPrimary(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnPrimaryButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return React.createElement(ReactRoblox.createPortal, props)
	end
	function OnPrimaryButtonTextButton:componentDidMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnPrimaryButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnPrimary = OnPrimaryButtonTextButton
end

do
	local OnSecondaryButtonTextButton = React.Component:extend("OnSecondaryButtonTextButton")
	OnSecondaryButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_SECONDARY.STYLE,
		onClick = DEFAULTS.ON_SECONDARY.ON_CLICK,
		text = DEFAULTS.ON_SECONDARY.TEXT,
		icon = DEFAULTS.ON_SECONDARY.ICON,
		elevation = DEFAULTS.ON_SECONDARY.ELEVATION,
		isEnabled = DEFAULTS.ON_SECONDARY.IS_ENABLED,
	}
	function OnSecondaryButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onSecondary(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnSecondaryButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return React.createElement(ReactRoblox.createPortal, props)
	end
	function OnSecondaryButtonTextButton:componentDidMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnSecondaryButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnSecondary = OnSecondaryButtonTextButton
end

do
	local OnTertiaryButtonTextButton = React.Component:extend("OnTertiaryButtonTextButton")
	OnTertiaryButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_TERTIARY.STYLE,
		onClick = DEFAULTS.ON_TERTIARY.ON_CLICK,
		text = DEFAULTS.ON_TERTIARY.TEXT,
		icon = DEFAULTS.ON_TERTIARY.ICON,
		elevation = DEFAULTS.ON_TERTIARY.ELEVATION,
		isEnabled = DEFAULTS.ON_TERTIARY.IS_ENABLED,
	}
	function OnTertiaryButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onTertiary(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnTertiaryButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return React.createElement(ReactRoblox.createPortal, props)
	end
	function OnTertiaryButtonTextButton:componentDidMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnTertiaryButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnTertiary = OnTertiaryButtonTextButton
end

do
	local OnPrimaryContainerButtonTextButton = React.Component:extend("OnPrimaryContainerButtonTextButton")
	OnPrimaryContainerButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_PRIMARY_CONTAINER.STYLE,
		onClick = DEFAULTS.ON_PRIMARY_CONTAINER.ON_CLICK,
		text = DEFAULTS.ON_PRIMARY_CONTAINER.TEXT,
		icon = DEFAULTS.ON_PRIMARY_CONTAINER.ICON,
		elevation = DEFAULTS.ON_PRIMARY_CONTAINER.ELEVATION,
		isEnabled = DEFAULTS.ON_PRIMARY_CONTAINER.IS_ENABLED,
	}
	function OnPrimaryContainerButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onPrimaryContainer(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnPrimaryContainerButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return React.createElement(ReactRoblox.createPortal, props)
	end
	function OnPrimaryContainerButtonTextButton:componentDidMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnPrimaryContainerButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnPrimaryContainer = OnPrimaryContainerButtonTextButton
end

do
	local OnSecondaryContainerButtonTextButton =
		React.Component:extend("OnSecondaryContainerButtonTextButton")
	OnSecondaryContainerButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_SECONDARY_CONTAINER.STYLE,
		onClick = DEFAULTS.ON_SECONDARY_CONTAINER.ON_CLICK,
		text = DEFAULTS.ON_SECONDARY_CONTAINER.TEXT,
		icon = DEFAULTS.ON_SECONDARY_CONTAINER.ICON,
		elevation = DEFAULTS.ON_SECONDARY_CONTAINER.ELEVATION,
		isEnabled = DEFAULTS.ON_SECONDARY_CONTAINER.IS_ENABLED,
	}
	function OnSecondaryContainerButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onSecondaryContainer(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnSecondaryContainerButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return React.createElement(ReactRoblox.createPortal, props)
	end
	function OnSecondaryContainerButtonTextButton:componentDidMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnSecondaryContainerButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnSecondaryContainer = OnSecondaryContainerButtonTextButton
end

do
	local OnTertiaryContainerButtonTextButton = React.Component:extend("OnTertiaryContainerButtonTextButton")
	OnTertiaryContainerButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_TERTIARY_CONTAINER.STYLE,
		onClick = DEFAULTS.ON_TERTIARY_CONTAINER.ON_CLICK,
		text = DEFAULTS.ON_TERTIARY_CONTAINER.TEXT,
		icon = DEFAULTS.ON_TERTIARY_CONTAINER.ICON,
		elevation = DEFAULTS.ON_TERTIARY_CONTAINER.ELEVATION,
		isEnabled = DEFAULTS.ON_TERTIARY_CONTAINER.IS_ENABLED,
	}
	function OnTertiaryContainerButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onTertiaryContainer(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnTertiaryContainerButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return React.createElement(ReactRoblox.createPortal, props)
	end
	function OnTertiaryContainerButtonTextButton:componentDidMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnTertiaryContainerButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnTertiaryContainer = OnTertiaryContainerButtonTextButton
end

return Interface


--!strict
-- this script was generated by the build system, please do not make manual edits
local _Package = script.Parent.Parent.Parent.Parent
local _Packages = _Package.Parent
-- Services
-- Packages
local Maid = require(_Packages:WaitForChild("Maid"))
local ColdFusion = require(_Packages:WaitForChild("ColdFusion"))
local Roact = require(_Packages:WaitForChild("Roact"))

-- Modules
local Types = require(_Package:WaitForChild("Types"))
local Style = require(_Package:WaitForChild("Style"))

local Source = require(script.Parent:WaitForChild("ColdFusion"))

-- Types
type Maid = Maid.Maid
type Style = Style.Style
type FontData = Types.FontData
type OptionData = Types.OptionData
type ButtonData = Types.ButtonData
type ImageData = Types.ImageData
type CanBeState<V> = ColdFusion.CanBeState<V>
-- Constants
local DEFAULTS = require(script.Parent:WaitForChild("Defaults"))
-- Variables
-- References
-- Private Functions
-- Class
local Interface = {}

do
	local NewButtonTextButton = Roact.Component:extend("NewButtonTextButton")
	NewButtonTextButton.defaultProps = {
		onClick = DEFAULTS.NEW.ON_CLICK,
		text = DEFAULTS.NEW.TEXT,
		icon = DEFAULTS.NEW.ICON,
		textColor = DEFAULTS.NEW.TEXT_COLOR,
		disabledTextColor = DEFAULTS.NEW.DISABLED_TEXT_COLOR,
		isEnabled = DEFAULTS.NEW.IS_ENABLED,
		elevation = DEFAULTS.NEW.ELEVATION,
		schemeType = DEFAULTS.NEW.SCHEME_TYPE,
		fontData = DEFAULTS.NEW.FONT_DATA,
		scale = DEFAULTS.NEW.SCALE,
	}
	function NewButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			textColor = _Value(self.defaultProps.textColor),
			disabledTextColor = _Value(self.defaultProps.disabledTextColor),
			isEnabled = _Value(self.defaultProps.isEnabled),
			elevation = _Value(self.defaultProps.elevation),
			schemeType = _Value(self.defaultProps.schemeType),
			fontData = _Value(self.defaultProps.fontData),
			scale = _Value(self.defaultProps.scale),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.new(
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.textColor,
			self._internalStates.disabledTextColor,
			self._internalStates.isEnabled,
			self._internalStates.elevation,
			self._internalStates.schemeType,
			self._internalStates.fontData,
			self._internalStates.scale
		)
	end

	function NewButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return Roact.createElement(Roact.Portal, props)
	end
	function NewButtonTextButton:didMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function NewButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.New = NewButtonTextButton
end

do
	local OnPrimaryButtonTextButton = Roact.Component:extend("OnPrimaryButtonTextButton")
	OnPrimaryButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_PRIMARY.STYLE,
		onClick = DEFAULTS.ON_PRIMARY.ON_CLICK,
		text = DEFAULTS.ON_PRIMARY.TEXT,
		icon = DEFAULTS.ON_PRIMARY.ICON,
		elevation = DEFAULTS.ON_PRIMARY.ELEVATION,
		isEnabled = DEFAULTS.ON_PRIMARY.IS_ENABLED,
	}
	function OnPrimaryButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onPrimary(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnPrimaryButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return Roact.createElement(Roact.Portal, props)
	end
	function OnPrimaryButtonTextButton:didMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnPrimaryButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnPrimary = OnPrimaryButtonTextButton
end

do
	local OnSecondaryButtonTextButton = Roact.Component:extend("OnSecondaryButtonTextButton")
	OnSecondaryButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_SECONDARY.STYLE,
		onClick = DEFAULTS.ON_SECONDARY.ON_CLICK,
		text = DEFAULTS.ON_SECONDARY.TEXT,
		icon = DEFAULTS.ON_SECONDARY.ICON,
		elevation = DEFAULTS.ON_SECONDARY.ELEVATION,
		isEnabled = DEFAULTS.ON_SECONDARY.IS_ENABLED,
	}
	function OnSecondaryButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onSecondary(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnSecondaryButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return Roact.createElement(Roact.Portal, props)
	end
	function OnSecondaryButtonTextButton:didMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnSecondaryButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnSecondary = OnSecondaryButtonTextButton
end

do
	local OnTertiaryButtonTextButton = Roact.Component:extend("OnTertiaryButtonTextButton")
	OnTertiaryButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_TERTIARY.STYLE,
		onClick = DEFAULTS.ON_TERTIARY.ON_CLICK,
		text = DEFAULTS.ON_TERTIARY.TEXT,
		icon = DEFAULTS.ON_TERTIARY.ICON,
		elevation = DEFAULTS.ON_TERTIARY.ELEVATION,
		isEnabled = DEFAULTS.ON_TERTIARY.IS_ENABLED,
	}
	function OnTertiaryButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onTertiary(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnTertiaryButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return Roact.createElement(Roact.Portal, props)
	end
	function OnTertiaryButtonTextButton:didMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnTertiaryButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnTertiary = OnTertiaryButtonTextButton
end

do
	local OnPrimaryContainerButtonTextButton = Roact.Component:extend("OnPrimaryContainerButtonTextButton")
	OnPrimaryContainerButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_PRIMARY_CONTAINER.STYLE,
		onClick = DEFAULTS.ON_PRIMARY_CONTAINER.ON_CLICK,
		text = DEFAULTS.ON_PRIMARY_CONTAINER.TEXT,
		icon = DEFAULTS.ON_PRIMARY_CONTAINER.ICON,
		elevation = DEFAULTS.ON_PRIMARY_CONTAINER.ELEVATION,
		isEnabled = DEFAULTS.ON_PRIMARY_CONTAINER.IS_ENABLED,
	}
	function OnPrimaryContainerButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onPrimaryContainer(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnPrimaryContainerButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return Roact.createElement(Roact.Portal, props)
	end
	function OnPrimaryContainerButtonTextButton:didMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnPrimaryContainerButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnPrimaryContainer = OnPrimaryContainerButtonTextButton
end

do
	local OnSecondaryContainerButtonTextButton =
		Roact.Component:extend("OnSecondaryContainerButtonTextButton")
	OnSecondaryContainerButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_SECONDARY_CONTAINER.STYLE,
		onClick = DEFAULTS.ON_SECONDARY_CONTAINER.ON_CLICK,
		text = DEFAULTS.ON_SECONDARY_CONTAINER.TEXT,
		icon = DEFAULTS.ON_SECONDARY_CONTAINER.ICON,
		elevation = DEFAULTS.ON_SECONDARY_CONTAINER.ELEVATION,
		isEnabled = DEFAULTS.ON_SECONDARY_CONTAINER.IS_ENABLED,
	}
	function OnSecondaryContainerButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onSecondaryContainer(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnSecondaryContainerButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return Roact.createElement(Roact.Portal, props)
	end
	function OnSecondaryContainerButtonTextButton:didMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnSecondaryContainerButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnSecondaryContainer = OnSecondaryContainerButtonTextButton
end

do
	local OnTertiaryContainerButtonTextButton = Roact.Component:extend("OnTertiaryContainerButtonTextButton")
	OnTertiaryContainerButtonTextButton.defaultProps = {
		style = DEFAULTS.ON_TERTIARY_CONTAINER.STYLE,
		onClick = DEFAULTS.ON_TERTIARY_CONTAINER.ON_CLICK,
		text = DEFAULTS.ON_TERTIARY_CONTAINER.TEXT,
		icon = DEFAULTS.ON_TERTIARY_CONTAINER.ICON,
		elevation = DEFAULTS.ON_TERTIARY_CONTAINER.ELEVATION,
		isEnabled = DEFAULTS.ON_TERTIARY_CONTAINER.IS_ENABLED,
	}
	function OnTertiaryContainerButtonTextButton:init(initialProps: { [string]: unknown })
		self._maid = Maid.new()
		local _fuse = ColdFusion.fuse(self._maid)
		local _Value = _fuse.Value
		self._internalStates = {
			style = _Value(self.defaultProps.style),
			onClick = _Value(self.defaultProps.onClick),
			text = _Value(self.defaultProps.text),
			icon = _Value(self.defaultProps.icon),
			elevation = _Value(self.defaultProps.elevation),
			isEnabled = _Value(self.defaultProps.isEnabled),
		}
		table.freeze(self._internalStates)
		for k, v in pairs(initialProps) do
			if self._internalStates[k] then
				self._internalStates[k]:Set(v)
			end
		end
		self._instance = Source.onTertiaryContainer(
			self._internalStates.style,
			self._internalStates.onClick,
			self._internalStates.text,
			self._internalStates.icon,
			self._internalStates.elevation,
			self._internalStates.isEnabled
		)
	end

	function OnTertiaryContainerButtonTextButton:render()
		local props = {
			target = self._instance,
		}
		for k, v in pairs(self.props) do
			if self.props[k] ~= v then
				if self._internalStates[k] then
					if v == nil then
						v = self.defaultProps[k]
					end
					self._internalStates[k]:Set(v)
				else
					props[k] = v
				end
			end
		end
		return Roact.createElement(Roact.Portal, props)
	end
	function OnTertiaryContainerButtonTextButton:didMount()
		for k, v in pairs(self) do
			if typeof(v) == "table" then
				if v["virtualNode"] then
					if self._instance.Parent ~= v["virtualNode"]["hostParent"] then
						self._instance.Parent = v["virtualNode"]["hostParent"]
					end
					break
				end
			end
		end
	end
	function OnTertiaryContainerButtonTextButton:willUnmount()
		self._maid:Destroy()
		self._instance:Destroy()
	end
	Interface.OnTertiaryContainer = OnTertiaryContainerButtonTextButton
end

return Interface


--!strict
-- this script was generated by the build system, please do not make manual edits
local _Package = script.Parent.Parent.Parent.Parent
local _Packages = _Package.Parent
-- Services
-- Packages
local Maid = require(_Packages:WaitForChild("Maid"))
local ColdFusion = require(_Packages:WaitForChild("ColdFusion"))

-- Modules
local Types = require(_Package:WaitForChild("Types"))
local Style = require(_Package:WaitForChild("Style"))
local Enums = require(_Package:WaitForChild("Enums"))

local Translators = require(_Package:WaitForChild("Translators"))

local Source = require(script.Parent:WaitForChild("ColdFusion"))

-- Types
type Maid = Maid.Maid
type Style = Style.Style
type FontData = Types.FontData
type OptionData = Types.OptionData
type ButtonData = Types.ButtonData
type ImageData = Types.ImageData
type CanBeState<V> = ColdFusion.CanBeState<V>
type Wrapper<BaseInstance, Definition, ClassName> = Translators.Wrapper<BaseInstance, Definition, ClassName>

export type TextButtonWrapperDefinition = {
	OnClick: () -> (),
	Text: string,
	Icon: ImageData?,
	TextColor: Color3,
	DisabledTextColor: Color3,
	IsEnabled: boolean,
	Elevation: number,
	SchemeType: Enums.SchemeType,
	FontData: FontData,
	Scale: number,
}
export type TextButtonWrapper = Wrapper<GuiObject, TextButtonWrapperDefinition, "TextButton">

export type StyledTextButtonWrapperDefinition = {
	Style: Style,
	OnClick: () -> (),
	Text: string,
	Icon: ImageData?,
	Elevation: number,
	IsEnabled: boolean,
}
export type StyledTextButtonWrapper = Wrapper<
	GuiObject,
	StyledTextButtonWrapperDefinition,
	"StyledTextButton"
>
-- Constants
local DEFAULTS = require(script.Parent:WaitForChild("Defaults"))
-- Variables
-- References
-- Private Functions
-- Interface
local Interface = {}

function Interface.new(): StyledTextButtonWrapper
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local _Value = _fuse.Value
	local definition = {
		OnClick = _Value(function() end),
		Text = _Value("Button"),
		Icon = _Value(nil),
		TextColor = _Value(Color3.new()),
		DisabledTextColor = _Value(Color3.new()),
		IsEnabled = _Value(true),
		Elevation = _Value(0),
		SchemeType = _Value(Enums.SchemeType.Light),
		FontData = _Value(Types.FontData.new(Font.fromEnum(Enum.Font.SourceSans), 14)),
		Scale = _Value(1),
	}
	local defaults: { [string]: unknown? } = {
		onClick = DEFAULTS.NEW.ON_CLICK,
		text = DEFAULTS.NEW.TEXT,
		icon = DEFAULTS.NEW.ICON,
		textColor = DEFAULTS.NEW.TEXT_COLOR,
		disabledTextColor = DEFAULTS.NEW.DISABLED_TEXT_COLOR,
		isEnabled = DEFAULTS.NEW.IS_ENABLED,
		elevation = DEFAULTS.NEW.ELEVATION,
		schemeType = DEFAULTS.NEW.SCHEME_TYPE,
		fontData = DEFAULTS.NEW.FONT_DATA,
		scale = DEFAULTS.NEW.SCALE,
	}
	local inst: GuiObject = Source.new(
		definition.OnClick,
		definition.Text,
		definition.Icon,
		definition.TextColor,
		definition.DisabledTextColor,
		definition.IsEnabled,
		definition.Elevation,
		definition.SchemeType,
		definition.FontData,
		definition.Scale
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	local wrapper, cleanUp = Translators.ColdFusion.toWrapper("StyledTextButton", inst, definition, defaults)
	maid:GiveTask(cleanUp)
	return wrapper
end

function Interface.onPrimary(): StyledTextButtonWrapper
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local _Value = _fuse.Value
	local definition = {
		Style = _Value(Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7))),
		OnClick = _Value(function() end),
		Text = _Value("Button"),
		Icon = _Value(nil),
		Elevation = _Value(0),
		IsEnabled = _Value(true),
	}
	local defaults: { [string]: unknown? } = {
		style = DEFAULTS.ON_PRIMARY.STYLE,
		onClick = DEFAULTS.ON_PRIMARY.ON_CLICK,
		text = DEFAULTS.ON_PRIMARY.TEXT,
		icon = DEFAULTS.ON_PRIMARY.ICON,
		elevation = DEFAULTS.ON_PRIMARY.ELEVATION,
		isEnabled = DEFAULTS.ON_PRIMARY.IS_ENABLED,
	}
	local inst: GuiObject = Source.onPrimary(
		definition.Style,
		definition.OnClick,
		definition.Text,
		definition.Icon,
		definition.Elevation,
		definition.IsEnabled
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	local wrapper, cleanUp = Translators.ColdFusion.toWrapper("StyledTextButton", inst, definition, defaults)
	maid:GiveTask(cleanUp)
	return wrapper
end

function Interface.onSecondary(): StyledTextButtonWrapper
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local _Value = _fuse.Value
	local definition = {
		Style = _Value(Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7))),
		OnClick = _Value(function() end),
		Text = _Value("Button"),
		Icon = _Value(nil),
		Elevation = _Value(0),
		IsEnabled = _Value(true),
	}
	local defaults: { [string]: unknown? } = {
		style = DEFAULTS.ON_SECONDARY.STYLE,
		onClick = DEFAULTS.ON_SECONDARY.ON_CLICK,
		text = DEFAULTS.ON_SECONDARY.TEXT,
		icon = DEFAULTS.ON_SECONDARY.ICON,
		elevation = DEFAULTS.ON_SECONDARY.ELEVATION,
		isEnabled = DEFAULTS.ON_SECONDARY.IS_ENABLED,
	}
	local inst: GuiObject = Source.onSecondary(
		definition.Style,
		definition.OnClick,
		definition.Text,
		definition.Icon,
		definition.Elevation,
		definition.IsEnabled
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	local wrapper, cleanUp = Translators.ColdFusion.toWrapper("StyledTextButton", inst, definition, defaults)
	maid:GiveTask(cleanUp)
	return wrapper
end

function Interface.onTertiary(): StyledTextButtonWrapper
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local _Value = _fuse.Value
	local definition = {
		Style = _Value(Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7))),
		OnClick = _Value(function() end),
		Text = _Value("Button"),
		Icon = _Value(nil),
		Elevation = _Value(0),
		IsEnabled = _Value(true),
	}
	local defaults: { [string]: unknown? } = {
		style = DEFAULTS.ON_TERTIARY.STYLE,
		onClick = DEFAULTS.ON_TERTIARY.ON_CLICK,
		text = DEFAULTS.ON_TERTIARY.TEXT,
		icon = DEFAULTS.ON_TERTIARY.ICON,
		elevation = DEFAULTS.ON_TERTIARY.ELEVATION,
		isEnabled = DEFAULTS.ON_TERTIARY.IS_ENABLED,
	}
	local inst: GuiObject = Source.onTertiary(
		definition.Style,
		definition.OnClick,
		definition.Text,
		definition.Icon,
		definition.Elevation,
		definition.IsEnabled
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	local wrapper, cleanUp = Translators.ColdFusion.toWrapper("StyledTextButton", inst, definition, defaults)
	maid:GiveTask(cleanUp)
	return wrapper
end

function Interface.onPrimaryContainer(): StyledTextButtonWrapper
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local _Value = _fuse.Value
	local definition = {
		Style = _Value(Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7))),
		OnClick = _Value(function() end),
		Text = _Value("Button"),
		Icon = _Value(nil),
		Elevation = _Value(0),
		IsEnabled = _Value(true),
	}
	local defaults: { [string]: unknown? } = {
		style = DEFAULTS.ON_PRIMARY_CONTAINER.STYLE,
		onClick = DEFAULTS.ON_PRIMARY_CONTAINER.ON_CLICK,
		text = DEFAULTS.ON_PRIMARY_CONTAINER.TEXT,
		icon = DEFAULTS.ON_PRIMARY_CONTAINER.ICON,
		elevation = DEFAULTS.ON_PRIMARY_CONTAINER.ELEVATION,
		isEnabled = DEFAULTS.ON_PRIMARY_CONTAINER.IS_ENABLED,
	}
	local inst: GuiObject = Source.onPrimaryContainer(
		definition.Style,
		definition.OnClick,
		definition.Text,
		definition.Icon,
		definition.Elevation,
		definition.IsEnabled
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	local wrapper, cleanUp = Translators.ColdFusion.toWrapper("StyledTextButton", inst, definition, defaults)
	maid:GiveTask(cleanUp)
	return wrapper
end

function Interface.onSecondaryContainer(): StyledTextButtonWrapper
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local _Value = _fuse.Value
	local definition = {
		Style = _Value(Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7))),
		OnClick = _Value(function() end),
		Text = _Value("Button"),
		Icon = _Value(nil),
		Elevation = _Value(0),
		IsEnabled = _Value(true),
	}
	local defaults: { [string]: unknown? } = {
		style = DEFAULTS.ON_SECONDARY_CONTAINER.STYLE,
		onClick = DEFAULTS.ON_SECONDARY_CONTAINER.ON_CLICK,
		text = DEFAULTS.ON_SECONDARY_CONTAINER.TEXT,
		icon = DEFAULTS.ON_SECONDARY_CONTAINER.ICON,
		elevation = DEFAULTS.ON_SECONDARY_CONTAINER.ELEVATION,
		isEnabled = DEFAULTS.ON_SECONDARY_CONTAINER.IS_ENABLED,
	}
	local inst: GuiObject = Source.onSecondaryContainer(
		definition.Style,
		definition.OnClick,
		definition.Text,
		definition.Icon,
		definition.Elevation,
		definition.IsEnabled
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	local wrapper, cleanUp = Translators.ColdFusion.toWrapper("StyledTextButton", inst, definition, defaults)
	maid:GiveTask(cleanUp)
	return wrapper
end

function Interface.onTertiaryContainer(): StyledTextButtonWrapper
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local _Value = _fuse.Value
	local definition = {
		Style = _Value(Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7))),
		OnClick = _Value(function() end),
		Text = _Value("Button"),
		Icon = _Value(nil),
		Elevation = _Value(0),
		IsEnabled = _Value(true),
	}
	local defaults: { [string]: unknown? } = {
		style = DEFAULTS.ON_TERTIARY_CONTAINER.STYLE,
		onClick = DEFAULTS.ON_TERTIARY_CONTAINER.ON_CLICK,
		text = DEFAULTS.ON_TERTIARY_CONTAINER.TEXT,
		icon = DEFAULTS.ON_TERTIARY_CONTAINER.ICON,
		elevation = DEFAULTS.ON_TERTIARY_CONTAINER.ELEVATION,
		isEnabled = DEFAULTS.ON_TERTIARY_CONTAINER.IS_ENABLED,
	}
	local inst: GuiObject = Source.onTertiaryContainer(
		definition.Style,
		definition.OnClick,
		definition.Text,
		definition.Icon,
		definition.Elevation,
		definition.IsEnabled
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	local wrapper, cleanUp = Translators.ColdFusion.toWrapper("StyledTextButton", inst, definition, defaults)
	maid:GiveTask(cleanUp)
	return wrapper
end

return Interface


--!strict
local _Package = script.Parent.Parent.Parent.Parent
local _Packages = _Package.Parent
-- Services
-- Packages
local Maid = require(_Packages:WaitForChild("Maid"))
local Icons = require(_Packages:WaitForChild("MaterialIcons"))

-- Modules
local Style = require(_Package:WaitForChild("Style"))
local Enums = require(_Package:WaitForChild("Enums"))

-- Types
-- Constants
-- Variables
-- References

-- Class
return function(frame: Frame)
	local maid = Maid.new()
	task.spawn(function()
		local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame
			local style = Style.new(
				1.5,
				Enum.Font.SourceSans,
				if isDarkMode then Enums.SchemeType.Dark else Enums.SchemeType.Light,
				color
			)

			local halfFrame = maid:GiveTask(Instance.new("Frame"))
			halfFrame.BackgroundColor3 = style:GetColor(Enums.ColorRoleType.Primary)
			halfFrame.BorderSizePixel = 0
			local listLayout = maid:GiveTask(Instance.new("UIListLayout"))
			listLayout.FillDirection = Enum.FillDirection.Vertical
			listLayout.Padding = UDim.new(0, 10)
			listLayout.VerticalAlignment = Enum.VerticalAlignment.Center
			listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center
			listLayout.Parent = halfFrame

			local Module = require(script.Parent:WaitForChild("ColdFusion"))

			do
				local button = maid:GiveTask(
					Module.new(
						function()
							print("click")
						end,
						"Button",
						nil,
						style:GetColor(Enums.ColorRoleType.OnPrimary),
						style:GetColor(Enums.ColorRoleType.SurfaceVariant),
						true,
						0,
						style.SchemeType,
						style:GetFontData(Enums.FontType.LabelLarge),
						style.Scale
					)
				)
				button.Parent = halfFrame
			end

			do
				local button = maid:GiveTask(
					Module.new(
						function()
							print("click")
						end,
						"Disabled",
						nil,
						style:GetColor(Enums.ColorRoleType.OnPrimary),
						style:GetColor(Enums.ColorRoleType.SurfaceVariant),
						false,
						0,
						style.SchemeType,
						style:GetFontData(Enums.FontType.LabelLarge),
						style.Scale
					)
				)
				button.Parent = halfFrame
			end

			do
				local button = maid:GiveTask(
					Module.new(
						function()
							print("click")
						end,
						"Icon",
						Icons.waterfall_chart,
						style:GetColor(Enums.ColorRoleType.OnPrimary),
						style:GetColor(Enums.ColorRoleType.SurfaceVariant),
						true,
						0,
						style.SchemeType,
						style:GetFontData(Enums.FontType.LabelLarge),
						style.Scale
					)
				)
				button.Parent = halfFrame
			end

			return halfFrame
		end

		local COLORS: { [number]: Color3 } = {
			Color3.fromHSV(0, 0.9, 0.8),
			-- Color3.fromHSV(0, 0.25, 0.8),
			-- Color3.fromHSV(0, 0.9, 0.5),
			Color3.fromHSV(0.6, 0.9, 0.7),
			Color3.fromHSV(0.35, 0.9, 0.7),
			-- Color3.fromHSV(0.1, 0.9, 0.7),
		}

		for i, color in ipairs(COLORS) do
			local x = (i - 1) / #COLORS
			local width = 1 / #COLORS
			local dark = makeHalfFrame(true, color)

			dark.Size = UDim2.fromScale(width, 0.5)
			dark.Position = UDim2.fromScale(x, 0.5)
			dark.Parent = frame

			local bright = makeHalfFrame(false, color)
			bright.Size = UDim2.fromScale(width, 0.5)
			bright.Position = UDim2.fromScale(x, 0)
			bright.Parent = frame
		end
	end)
	return function()
		maid:Destroy()
	end
end


--!strict
local _Package = script.Parent.Parent.Parent.Parent
local _Packages = _Package.Parent
-- Services
-- Packages
local Maid = require(_Packages:WaitForChild("Maid"))
local Icons = require(_Packages:WaitForChild("MaterialIcons"))

-- Modules
local Style = require(_Package:WaitForChild("Style"))
local Enums = require(_Package:WaitForChild("Enums"))

-- Types
-- Constants
-- Variables
-- References

-- Class
return function(frame: Frame)
	local maid = Maid.new()
	task.spawn(function()
		local function makeHalfFrame(isDarkMode: boolean, color: Color3): Frame
			local style = Style.new(
				1.5,
				Enum.Font.SourceSans,
				if isDarkMode then Enums.SchemeType.Dark else Enums.SchemeType.Light,
				color
			)

			local halfFrame = maid:GiveTask(Instance.new("Frame"))
			halfFrame.BackgroundColor3 = style:GetColor(Enums.ColorRoleType.Primary)
			halfFrame.BorderSizePixel = 0
			local listLayout = maid:GiveTask(Instance.new("UIListLayout"))
			listLayout.FillDirection = Enum.FillDirection.Vertical
			listLayout.Padding = UDim.new(0, 10)
			listLayout.VerticalAlignment = Enum.VerticalAlignment.Center
			listLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center
			listLayout.Parent = halfFrame

			local Module = require(script.Parent:WaitForChild("ColdFusion"))

			do
				local button = maid:GiveTask(Module.onPrimary(style, function()
					print("click")
				end, "primary", Icons.call))
				button.Parent = halfFrame
			end

			do
				local button = maid:GiveTask(Module.onSecondary(style, function()
					print("click")
				end, "secondary", Icons.call))
				button.Parent = halfFrame
			end

			do
				local button = maid:GiveTask(Module.onTertiary(style, function()
					print("click")
				end, "tertiary", Icons.call))
				button.Parent = halfFrame
			end

			return halfFrame
		end

		local COLORS: { [number]: Color3 } = {
			Color3.fromHSV(0, 0.9, 0.8),
			-- Color3.fromHSV(0, 0.25, 0.8),
			-- Color3.fromHSV(0, 0.9, 0.5),
			Color3.fromHSV(0.6, 0.9, 0.7),
			Color3.fromHSV(0.35, 0.9, 0.7),
			-- Color3.fromHSV(0.1, 0.9, 0.7),
		}

		for i, color in ipairs(COLORS) do
			local x = (i - 1) / #COLORS
			local width = 1 / #COLORS
			local dark = makeHalfFrame(true, color)

			dark.Size = UDim2.fromScale(width, 0.5)
			dark.Position = UDim2.fromScale(x, 0.5)
			dark.Parent = frame

			local bright = makeHalfFrame(false, color)
			bright.Size = UDim2.fromScale(width, 0.5)
			bright.Position = UDim2.fromScale(x, 0)
			bright.Parent = frame
		end
	end)
	return function()
		maid:Destroy()
	end
end


--!strict
local _Package = script.Parent.Parent.Parent
local _Packages = _Package.Parent
-- Services
local SoundService = game:GetService("SoundService")
-- Packages
local Maid = require(_Packages:WaitForChild("Maid"))
local ColdFusion = require(_Packages:WaitForChild("ColdFusion"))
local Icons = require(_Packages:WaitForChild("MaterialIcons"))

-- Modules
local Types = require(_Package:WaitForChild("Types"))
local Style = require(_Package:WaitForChild("Style"))
local Enums = require(_Package:WaitForChild("Enums"))
local Sounds = require(_Package:WaitForChild("Sounds"))
local Theme = require(_Package:WaitForChild("Theme"))

-- Types
type Maid = Maid.Maid
type State<V> = ColdFusion.State<V>
type ValueState<V> = ColdFusion.ValueState<V>
type CanBeState<V> = ColdFusion.CanBeState<V>
type RenderData = Types.RenderData
type ImageData = Types.ImageData
type OptionData = Types.OptionData
type ButtonData = Types.ButtonData
type Style = Style.Style
type FontData = Types.FontData

-- Constants
local DEFAULTS = require(script.Parent:WaitForChild("Defaults"))
local CHECK_ICON = Icons.check
local DASH_ICON = Icons.remove
local LAYER_SIZE_DP = 40
local CHECKBOX_SIZE_DP = 18
local CHECKBOX_SHAPE_DP = 2
local UNSELECT_OUTLINE_WIDTH_DP = 2
-- Variables
-- References
-- Private Functions

-- Class
local Interface = {}

function newThemedComponent(
	themeDefaults: typeof(DEFAULTS.PRIMARY),
	style: CanBeState<Style>,
	outlineColor: Enums.ColorRoleType,
	fillColor: Enums.ColorRoleType,
	iconColor: Enums.ColorRoleType,
	disabledColor: Enums.ColorRoleType,
	onSelect: CanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: CanBeState<boolean?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	local maid = Maid.new()

	local _fuse = ColdFusion.fuse(maid)

	local _new = _fuse.new
	local _bind = _fuse.bind
	local _clone = _fuse.clone
	local _import = _fuse.import

	local _Value = _fuse.Value
	local _Computed = _fuse.Computed

	local styleState: State<Style> = _import(style, themeDefaults.STYLE)

	local out = Interface.new(
		_import(onSelect, themeDefaults.ON_SELECT or function(isSelected: boolean?) end),
		_import(initialSelection, themeDefaults.INITIAL_SELECTION),
		_import(isEnabled, themeDefaults.IS_ENABLED),
		_Computed(function(s: Style): Color3
			return s:GetColor(outlineColor)
		end, styleState),
		_Computed(function(s: Style): Color3
			return s:GetColor(fillColor)
		end, styleState),
		_Computed(function(s: Style): Color3
			return s:GetColor(iconColor)
		end, styleState),
		_Computed(function(s: Style): Color3
			return s:GetColor(disabledColor)
		end, styleState),
		_import(elevation, themeDefaults.ELEVATION),
		_Computed(function(s: Style): any
			return s.SchemeType
		end, styleState),
		_Computed(function(s: Style): FontData
			return s:GetFontData(Enums.FontType.LabelLarge)
		end, styleState),
		_Computed(function(s: Style): number
			return s.Scale
		end, styleState)
	)

	maid:GiveTask(out.Destroying:Connect(function()
		maid:Destroy()
	end))

	return out
end

function Interface.primary(
	style: CanBeState<Style>,
	onSelect: CanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: CanBeState<boolean?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.PRIMARY,
		style,
		Enums.ColorRoleType.OnSurfaceVariant,
		Enums.ColorRoleType.Primary,
		Enums.ColorRoleType.OnPrimary,
		Enums.ColorRoleType.OnSurface,
		onSelect,
		initialSelection,
		elevation,
		isEnabled
	)
end

function Interface.secondary(
	style: CanBeState<Style>,
	onSelect: CanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: CanBeState<boolean?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.SECONDARY,
		style,
		Enums.ColorRoleType.OnSurfaceVariant,
		Enums.ColorRoleType.Secondary,
		Enums.ColorRoleType.OnSecondary,
		Enums.ColorRoleType.OnSurface,
		onSelect,
		initialSelection,
		elevation,
		isEnabled
	)
end

function Interface.tertiary(
	style: CanBeState<Style>,
	onSelect: CanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: CanBeState<boolean?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.TERTIARY,
		style,
		Enums.ColorRoleType.OnSurfaceVariant,
		Enums.ColorRoleType.Tertiary,
		Enums.ColorRoleType.OnTertiary,
		Enums.ColorRoleType.OnSurface,
		onSelect,
		initialSelection,
		elevation,
		isEnabled
	)
end

function Interface.primaryContainer(
	style: CanBeState<Style>,
	onSelect: CanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: CanBeState<boolean?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.PRIMARY_CONTAINER,
		style,
		Enums.ColorRoleType.OnSurfaceVariant,
		Enums.ColorRoleType.PrimaryContainer,
		Enums.ColorRoleType.OnPrimaryContainer,
		Enums.ColorRoleType.OnSurface,
		onSelect,
		initialSelection,
		elevation,
		isEnabled
	)
end

function Interface.secondaryContainer(
	style: CanBeState<Style>,
	onSelect: CanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: CanBeState<boolean?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.SECONDARY_CONTAINER,
		style,
		Enums.ColorRoleType.OnSurfaceVariant,
		Enums.ColorRoleType.SecondaryContainer,
		Enums.ColorRoleType.OnSecondaryContainer,
		Enums.ColorRoleType.OnSurface,
		onSelect,
		initialSelection,
		elevation,
		isEnabled
	)
end

function Interface.tertiaryContainer(
	style: CanBeState<Style>,
	onSelect: CanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: CanBeState<boolean?>,
	elevation: CanBeState<number?>,
	isEnabled: CanBeState<boolean?>
): GuiObject
	return newThemedComponent(
		DEFAULTS.TERTIARY_CONTAINER,
		style,
		Enums.ColorRoleType.OnSurfaceVariant,
		Enums.ColorRoleType.TertiaryContainer,
		Enums.ColorRoleType.OnTertiaryContainer,
		Enums.ColorRoleType.OnSurface,
		onSelect,
		initialSelection,
		elevation,
		isEnabled
	)
end

function Interface.new(
	onSelect: CanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: CanBeState<boolean?>,
	isEnabled: CanBeState<boolean>,
	outlineColor: CanBeState<Color3>,
	fillColor: CanBeState<Color3>,
	iconColor: CanBeState<Color3>,
	disabledColor: CanBeState<Color3>,
	elevation: CanBeState<number>,
	schemeType: CanBeState<Enums.SchemeType>,
	fontData: CanBeState<FontData>,
	scale: CanBeState<number>
): GuiObject
	local maid = Maid.new()

	local _fuse = ColdFusion.fuse(maid)

	local _new = _fuse.new
	local _bind = _fuse.bind
	local _clone = _fuse.clone
	local _import = _fuse.import

	local _Value = _fuse.Value
	local _Computed = _fuse.Computed

	local scaleState: State<number> = _import(scale, DEFAULTS.NEW.SCALE)
	local schemeTypeState: State<Enums.SchemeType> = _import(schemeType, DEFAULTS.NEW.SCHEME_TYPE)
	local fontDataState: State<FontData> = _import(fontData, DEFAULTS.NEW.FONT_DATA)

	local initialSelectionState = _import(initialSelection, DEFAULTS.NEW.INITIAL_SELECTION)
	local outlineColorState = _import(outlineColor, DEFAULTS.NEW.OUTLINE_COLOR)
	local fillColorState = _import(fillColor, DEFAULTS.NEW.FILL_COLOR)
	local disabledColorState = _import(disabledColor, DEFAULTS.NEW.DISABLED_COLOR)
	local iconColorState = _import(iconColor, DEFAULTS.NEW.ICON_COLOR)
	local elevationState = _import(elevation, DEFAULTS.NEW.ELEVATION)
	local isEnabledState = _import(isEnabled, DEFAULTS.NEW.IS_ENABLED)
	local onSelectState = _import(onSelect, DEFAULTS.NEW.ON_SELECT)

	local clickCountState = _Value(0)
	local hasClicked = _Value(false)

	initialSelectionState:Connect(function()
		hasClicked:Set(false)
	end)

	local valueState = _Computed(function(initial: boolean?, count: number, hasClick: boolean): boolean?
		if initial == nil then
			initial = false
			if count == 0 and hasClick == false then
				return nil
			end
		end
		if count % 2 == 0 then
			return initial
		else
			return not initial
		end
	end, initialSelectionState, clickCountState, hasClicked)

	local renderDatasState = _Computed(
		function(
			st: Enums.SchemeType,
			sc: number,
			f: FontData,
			oC: Color3,
			fC: Color3,
			iC: Color3,
			dC: Color3,
			e: number
		): { [Enums.ButtonStateType]: RenderData }
			return {
				[Enums.ButtonStateType.Enabled] = Types._RenderData.new(
					sc,
					Types._AppearanceData.new(Theme.getElevatedColor(oC, e, st), 0),
					Types._AppearanceData.new(Theme.getElevatedColor(fC, e, st), 1),
					Types._AppearanceData.new(Theme.getElevatedColor(iC, e, st), 0),
					nil,
					nil,
					nil,
					nil
				),
				[Enums.ButtonStateType.Disabled] = Types._RenderData.new(
					sc,
					Types._AppearanceData.new(Theme.getElevatedColor(dC, e, st), 1 - 0.38),
					Types._AppearanceData.new(Theme.getElevatedColor(dC, e, st), 1),
					Types._AppearanceData.new(Theme.getElevatedColor(dC, e, st), 1 - 0.38),
					nil,
					nil,
					nil,
					nil
				),
				[Enums.ButtonStateType.Hovered] = Types._RenderData.new(
					sc,
					Types._AppearanceData.new(Theme.getElevatedColor(oC, e + 1, st), 0),
					Types._AppearanceData.new(Theme.getElevatedColor(fC, e + 1, st), 1 - 0.08),
					Types._AppearanceData.new(Theme.getElevatedColor(iC, e + 1, st), 0),
					nil,
					nil,
					nil,
					nil
				),
				[Enums.ButtonStateType.Focused] = Types._RenderData.new(
					sc,
					Types._AppearanceData.new(Theme.getElevatedColor(oC, e, st), 0),
					Types._AppearanceData.new(Theme.getElevatedColor(fC, e, st), 1 - 0.1),
					Types._AppearanceData.new(Theme.getElevatedColor(iC, e, st), 0),
					nil,
					nil,
					nil,
					nil
				),
				[Enums.ButtonStateType.Pressed] = Types._RenderData.new(
					sc,
					Types._AppearanceData.new(Theme.getElevatedColor(oC, e - 1, st), 0),
					Types._AppearanceData.new(Theme.getElevatedColor(fC, e - 1, st), 1 - 0.1),
					Types._AppearanceData.new(Theme.getElevatedColor(iC, e - 1, st), 0),
					nil,
					nil,
					nil,
					nil
				),
			}
		end,
		schemeTypeState,
		scaleState,
		fontDataState,
		outlineColorState,
		fillColorState,
		iconColorState,
		disabledColorState,
		elevationState
	)

	local isFocusedState = _Value(false)
	local isPressedState = _Value(false)
	local isHoveredState = _Value(false)

	local iconImageState = _Computed(function(v: boolean?): ImageData
		if v == nil then
			return DASH_ICON
		elseif v == true then
			return CHECK_ICON
		else
			return Types.ImageData.new("")
		end
	end, valueState)

	local currentStateState = _Computed(
		function(
			isEnab: boolean,
			isFocused: boolean,
			isPressed: boolean,
			isHovered: boolean
		): Enums.ButtonStateType
			if isEnab then
				if isPressed then
					return Enums.ButtonStateType.Pressed
				else
					if isHovered then
						return Enums.ButtonStateType.Hovered
					else
						if isFocused then
							return Enums.ButtonStateType.Focused
						else
							return Enums.ButtonStateType.Enabled
						end
					end
				end
			else
				return Enums.ButtonStateType.Disabled
			end
		end,
		isEnabledState,
		isFocusedState,
		isPressedState,
		isHoveredState
	) :: State<any>

	local renderDataState = _Computed(
		function(
			renderDatas: { [Enums.ButtonStateType]: RenderData },
			bState: Enums.ButtonStateType
		): RenderData
			return renderDatas[bState]
		end,
		renderDatasState,
		currentStateState
	)

	local inst = _new("ImageButton")({
		Name = "Checkbox",
		Size = _Computed(function(sc: number): UDim2
			return UDim2.fromOffset(sc * LAYER_SIZE_DP, sc * LAYER_SIZE_DP)
		end, scaleState),
		BackgroundColor3 = _Computed(function(data: RenderData): Color3
			return data.Background.Color3
		end, renderDataState),
		BackgroundTransparency = _Computed(function(data: RenderData): number
			return data.Background.Transparency
		end, renderDataState),
		Events = {
			Activated = function()
				if isEnabledState:Get() == false then
					return
				end
				hasClicked:Set(true)
				local onClick = onSelectState:Get()
				local count = clickCountState:Get() + 1
				clickCountState:Set(count)

				do
					local sound = Instance.new("Sound")
					sound.Volume = 1
					if valueState:Get() == true then
						sound.SoundId = Sounds.Library[Enums.SoundType.navigation_forward_selection_minimal]
					else
						sound.SoundId = Sounds.Library[Enums.SoundType.navigation_backward_selection_minimal]
					end
					SoundService:PlayLocalSound(sound)
					sound:Destroy()
				end

				onClick(valueState:Get())
			end,
			MouseButton1Down = function()
				if isEnabledState:Get() == false then
					return
				end
				isPressedState:Set(true)
			end,
			MouseButton1Up = function()
				if isEnabledState:Get() == false then
					return
				end
				isPressedState:Set(false)
			end,
			MouseEnter = function()
				isHoveredState:Set(true)
			end,
			MouseLeave = function()
				isHoveredState:Set(false)
			end,
			SelectionGained = function()
				isFocusedState:Set(true)
			end,
			SelectionLost = function()
				isFocusedState:Set(false)
			end,
		},
		Children = {
			_new("UICorner")({
				CornerRadius = UDim.new(0.5, 0),
			}),
			_new("UIListLayout")({
				Padding = UDim.new(0, 0),
				SortOrder = Enum.SortOrder.LayoutOrder,
				FillDirection = Enum.FillDirection.Horizontal,
				ItemLineAlignment = Enum.ItemLineAlignment.Center,
				VerticalAlignment = Enum.VerticalAlignment.Center,
				HorizontalAlignment = Enum.HorizontalAlignment.Center,
			}),
			_new("ImageLabel")({
				Size = _Computed(function(sc: number): UDim2
					local dpWidth = CHECKBOX_SIZE_DP - (UNSELECT_OUTLINE_WIDTH_DP * 2)
					return UDim2.fromOffset(sc * dpWidth, sc * dpWidth)
				end, scaleState),
				BackgroundTransparency = _Computed(function(v: boolean?, enab: boolean): number
					return if enab then if v == false then 1 else 0 else 1
				end, valueState, isEnabledState),
				ImageTransparency = _Computed(function(v: boolean?): number
					return if v == false then 1 else 0
				end, valueState),
				BackgroundColor3 = _Computed(function(renderData: RenderData): Color3
					return renderData.Background.Color3
				end, renderDataState),
				ImageColor3 = _Computed(function(renderData: RenderData, enab: boolean): Color3
					return if not enab
						then renderData.Border.Color3
						else if renderData.Text then renderData.Text.Color3 else Color3.new(1, 1, 1)
				end, renderDataState, isEnabledState),
				Image = _Computed(function(i: ImageData?): string
					if i then
						return i.Image
					else
						return ""
					end
				end, iconImageState),
				ImageRectOffset = _Computed(function(i: ImageData?): Vector2
					return if i then i.ImageRectOffset else Vector2.zero
				end, iconImageState),
				ImageRectSize = _Computed(function(i: ImageData?): Vector2
					return if i then i.ImageRectSize else Vector2.zero
				end, iconImageState),
				Children = {
					_new("UICorner")({
						CornerRadius = _Computed(function(sc: number): UDim
							return UDim.new(0, sc * CHECKBOX_SHAPE_DP)
						end, scaleState),
					}),
					_new("UIStroke")({
						ApplyStrokeMode = Enum.ApplyStrokeMode.Border,
						Color = _Computed(function(renderData: RenderData, v: boolean?): Color3
							return if v == false
								then renderData.Border.Color3
								else renderData.Background.Color3
						end, renderDataState, valueState),
						LineJoinMode = Enum.LineJoinMode.Round,
						Thickness = _Computed(function(sc: number): number
							return sc * UNSELECT_OUTLINE_WIDTH_DP
						end, scaleState),
						Transparency = _Computed(function(renderData: RenderData): number
							return renderData.Border.Transparency
						end, renderDataState),
					}),
				},
			}),
		},
	}) :: GuiObject

	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))

	return inst
end

return Interface


--!strict
-- this script was generated by the build system, please do not make manual edits
local _Package = script.Parent.Parent.Parent
local _Packages = _Package.Parent
-- Services
-- Packages
local Maid = require(_Packages:WaitForChild("Maid"))
local ColdFusion = require(_Packages:WaitForChild("ColdFusion"))

-- Modules
local Types = require(_Package:WaitForChild("Types"))
local Style = require(_Package:WaitForChild("Style"))
local Enums = require(_Package:WaitForChild("Enums"))

-- Types
type Maid = Maid.Maid
type Style = Style.Style
type FontData = Types.FontData
type OptionData = Types.OptionData
type ButtonData = Types.ButtonData
type ImageData = Types.ImageData
type CanBeState<V> = ColdFusion.CanBeState<V>

return {
	NEW = {
		ON_SELECT = function(isSelected: boolean?) end,
		INITIAL_SELECTION = nil :: boolean?,
		IS_ENABLED = true,
		OUTLINE_COLOR = Color3.new(),
		FILL_COLOR = Color3.new(),
		ICON_COLOR = Color3.new(),
		DISABLED_COLOR = Color3.new(),
		ELEVATION = 0,
		SCHEME_TYPE = Enums.SchemeType.Light,
		FONT_DATA = Types.FontData.new(Font.fromEnum(Enum.Font.SourceSans), 14),
		SCALE = 1,
	},
	PRIMARY = {
		STYLE = Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7)),
		ON_SELECT = function(isSelected: boolean?) end,
		INITIAL_SELECTION = nil :: boolean?,
		ELEVATION = 0,
		IS_ENABLED = true,
	},
	SECONDARY = {
		STYLE = Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7)),
		ON_SELECT = function(isSelected: boolean?) end,
		INITIAL_SELECTION = nil :: boolean?,
		ELEVATION = 0,
		IS_ENABLED = true,
	},
	TERTIARY = {
		STYLE = Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7)),
		ON_SELECT = function(isSelected: boolean?) end,
		INITIAL_SELECTION = nil :: boolean?,
		ELEVATION = 0,
		IS_ENABLED = true,
	},
	PRIMARY_CONTAINER = {
		STYLE = Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7)),
		ON_SELECT = function(isSelected: boolean?) end,
		INITIAL_SELECTION = nil :: boolean?,
		ELEVATION = 0,
		IS_ENABLED = true,
	},
	SECONDARY_CONTAINER = {
		STYLE = Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7)),
		ON_SELECT = function(isSelected: boolean?) end,
		INITIAL_SELECTION = nil :: boolean?,
		ELEVATION = 0,
		IS_ENABLED = true,
	},
	TERTIARY_CONTAINER = {
		STYLE = Style.new(1, Enum.Font.SourceSans, "Light", Color3.new(0, 0.4, 0.7)),
		ON_SELECT = function(isSelected: boolean?) end,
		INITIAL_SELECTION = nil :: boolean?,
		ELEVATION = 0,
		IS_ENABLED = true,
	},
}


--!strict
-- this script was generated by the build system, please do not make manual edits
local _Package = script.Parent.Parent.Parent
local _Packages = _Package.Parent
-- Services
-- Packages
local Maid = require(_Packages:WaitForChild("Maid"))
local ColdFusion = require(_Packages:WaitForChild("ColdFusion"))

-- Modules
local Types = require(_Package:WaitForChild("Types"))
local Style = require(_Package:WaitForChild("Style"))
local Enums = require(_Package:WaitForChild("Enums"))

local Translators = require(_Package:WaitForChild("Translators"))

local Source = require(script.Parent:WaitForChild("ColdFusion"))

-- Types
type Maid = Maid.Maid
type Style = Style.Style
type FontData = Types.FontData
type OptionData = Types.OptionData
type ButtonData = Types.ButtonData
type ImageData = Types.ImageData
type CanBeState<V> = ColdFusion.CanBeState<V>
type FusionCanBeState<V> = Translators.FusionCanBeState<V>

-- Constants
local DEFAULTS = require(script.Parent:WaitForChild("Defaults"))
-- Variables
-- References
-- Private Functions
-- Class
local Interface = {}

function Interface.new(
	onSelect: FusionCanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: FusionCanBeState<boolean?>,
	isEnabled: FusionCanBeState<boolean>,
	outlineColor: FusionCanBeState<Color3>,
	fillColor: FusionCanBeState<Color3>,
	iconColor: FusionCanBeState<Color3>,
	disabledColor: FusionCanBeState<Color3>,
	elevation: FusionCanBeState<number>,
	schemeType: FusionCanBeState<Enums.SchemeType>,
	fontData: FusionCanBeState<FontData>,
	scale: FusionCanBeState<number>
): GuiObject
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local function convert<V>(value: FusionCanBeState<V>, default: V): CanBeState<V>
		return Translators.Fusion.toColdFusion(maid, _fuse, value, default)
	end
	local inst = Source.new(
		convert(onSelect, DEFAULTS.NEW.ON_SELECT),
		convert(initialSelection, DEFAULTS.NEW.INITIAL_SELECTION),
		convert(isEnabled, DEFAULTS.NEW.IS_ENABLED),
		convert(outlineColor, DEFAULTS.NEW.OUTLINE_COLOR),
		convert(fillColor, DEFAULTS.NEW.FILL_COLOR),
		convert(iconColor, DEFAULTS.NEW.ICON_COLOR),
		convert(disabledColor, DEFAULTS.NEW.DISABLED_COLOR),
		convert(elevation, DEFAULTS.NEW.ELEVATION),
		convert(schemeType, DEFAULTS.NEW.SCHEME_TYPE),
		convert(fontData, DEFAULTS.NEW.FONT_DATA),
		convert(scale, DEFAULTS.NEW.SCALE)
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	return inst
end

function Interface.primary(
	style: FusionCanBeState<Style>,
	onSelect: FusionCanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: FusionCanBeState<boolean?>,
	elevation: FusionCanBeState<number?>,
	isEnabled: FusionCanBeState<boolean?>
): GuiObject
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local function convert<V>(value: FusionCanBeState<V>, default: V): CanBeState<V>
		return Translators.Fusion.toColdFusion(maid, _fuse, value, default)
	end
	local inst = Source.primary(
		convert(style, DEFAULTS.PRIMARY.STYLE),
		convert(onSelect, DEFAULTS.PRIMARY.ON_SELECT),
		convert(initialSelection, DEFAULTS.PRIMARY.INITIAL_SELECTION),
		convert(elevation, DEFAULTS.PRIMARY.ELEVATION),
		convert(isEnabled, DEFAULTS.PRIMARY.IS_ENABLED)
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	return inst
end

function Interface.secondary(
	style: FusionCanBeState<Style>,
	onSelect: FusionCanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: FusionCanBeState<boolean?>,
	elevation: FusionCanBeState<number?>,
	isEnabled: FusionCanBeState<boolean?>
): GuiObject
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local function convert<V>(value: FusionCanBeState<V>, default: V): CanBeState<V>
		return Translators.Fusion.toColdFusion(maid, _fuse, value, default)
	end
	local inst = Source.secondary(
		convert(style, DEFAULTS.SECONDARY.STYLE),
		convert(onSelect, DEFAULTS.SECONDARY.ON_SELECT),
		convert(initialSelection, DEFAULTS.SECONDARY.INITIAL_SELECTION),
		convert(elevation, DEFAULTS.SECONDARY.ELEVATION),
		convert(isEnabled, DEFAULTS.SECONDARY.IS_ENABLED)
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	return inst
end

function Interface.tertiary(
	style: FusionCanBeState<Style>,
	onSelect: FusionCanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: FusionCanBeState<boolean?>,
	elevation: FusionCanBeState<number?>,
	isEnabled: FusionCanBeState<boolean?>
): GuiObject
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local function convert<V>(value: FusionCanBeState<V>, default: V): CanBeState<V>
		return Translators.Fusion.toColdFusion(maid, _fuse, value, default)
	end
	local inst = Source.tertiary(
		convert(style, DEFAULTS.TERTIARY.STYLE),
		convert(onSelect, DEFAULTS.TERTIARY.ON_SELECT),
		convert(initialSelection, DEFAULTS.TERTIARY.INITIAL_SELECTION),
		convert(elevation, DEFAULTS.TERTIARY.ELEVATION),
		convert(isEnabled, DEFAULTS.TERTIARY.IS_ENABLED)
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	return inst
end

function Interface.primaryContainer(
	style: FusionCanBeState<Style>,
	onSelect: FusionCanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: FusionCanBeState<boolean?>,
	elevation: FusionCanBeState<number?>,
	isEnabled: FusionCanBeState<boolean?>
): GuiObject
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local function convert<V>(value: FusionCanBeState<V>, default: V): CanBeState<V>
		return Translators.Fusion.toColdFusion(maid, _fuse, value, default)
	end
	local inst = Source.primaryContainer(
		convert(style, DEFAULTS.PRIMARY_CONTAINER.STYLE),
		convert(onSelect, DEFAULTS.PRIMARY_CONTAINER.ON_SELECT),
		convert(initialSelection, DEFAULTS.PRIMARY_CONTAINER.INITIAL_SELECTION),
		convert(elevation, DEFAULTS.PRIMARY_CONTAINER.ELEVATION),
		convert(isEnabled, DEFAULTS.PRIMARY_CONTAINER.IS_ENABLED)
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	return inst
end

function Interface.secondaryContainer(
	style: FusionCanBeState<Style>,
	onSelect: FusionCanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: FusionCanBeState<boolean?>,
	elevation: FusionCanBeState<number?>,
	isEnabled: FusionCanBeState<boolean?>
): GuiObject
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local function convert<V>(value: FusionCanBeState<V>, default: V): CanBeState<V>
		return Translators.Fusion.toColdFusion(maid, _fuse, value, default)
	end
	local inst = Source.secondaryContainer(
		convert(style, DEFAULTS.SECONDARY_CONTAINER.STYLE),
		convert(onSelect, DEFAULTS.SECONDARY_CONTAINER.ON_SELECT),
		convert(initialSelection, DEFAULTS.SECONDARY_CONTAINER.INITIAL_SELECTION),
		convert(elevation, DEFAULTS.SECONDARY_CONTAINER.ELEVATION),
		convert(isEnabled, DEFAULTS.SECONDARY_CONTAINER.IS_ENABLED)
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	return inst
end

function Interface.tertiaryContainer(
	style: FusionCanBeState<Style>,
	onSelect: FusionCanBeState<(isSelected: boolean?) -> ()>,
	initialSelection: FusionCanBeState<boolean?>,
	elevation: FusionCanBeState<number?>,
	isEnabled: FusionCanBeState<boolean?>
): GuiObject
	local maid = Maid.new()
	local _fuse = ColdFusion.fuse(maid)
	local function convert<V>(value: FusionCanBeState<V>, default: V): CanBeState<V>
		return Translators.Fusion.toColdFusion(maid, _fuse, value, default)
	end
	local inst = Source.tertiaryContainer(
		convert(style, DEFAULTS.TERTIARY_CONTAINER.STYLE),
		convert(onSelect, DEFAULTS.TERTIARY_CONTAINER.ON_SELECT),
		convert(initialSelection, DEFAULTS.TERTIARY_CONTAINER.INITIAL_SELECTION),
		convert(elevation, DEFAULTS.TERTIARY_CONTAINER.ELEVATION),
		convert(isEnabled, DEFAULTS.TERTIARY_CONTAINER.IS_ENABLED)
	)
	maid:GiveTask(inst.Destroying:Connect(function()
		maid:Destroy()
	end))
	return inst
end

return Interface