local d=require(script.Parent.Symbol)local o=require(script.Parent.strict)local H=require(script.Parent.Portal)local E=newproxy(true)local r={Portal=d.named("\080\111\114\116\097\108"),Host=d.named("\072\111\115\116"),Function=d.named("\070\117\110\099\116\105\111\110");Stateful=d.named("\083\116\097\116\101\102\117\108"),Fragment=d.named("\070\114\097\103\109\101\110\116")}function r.of(d)if typeof(d)~="\116\097\098\108\101"then return nil end return d[E]end local D={string=r.Host,["\102\117\110\099\116\105\111\110"]=r.Function,table=r.Stateful}function r.fromComponent(d)if d==H then return E.Portal else return D[typeof(d)]end end;(getmetatable(E)).__index=r o(r,"\069\108\101\109\101\110\116\075\105\110\100")return E
--[[
	Contains markers for annotating the type of an element.

	Use `ElementKind` as a key, and values from it as the value.

		local element = {
			[ElementKind] = ElementKind.Host,
		}
]]

local Symbol = require(script.Parent.Symbol)
local strict = require(script.Parent.strict)
local Portal = require(script.Parent.Portal)

local ElementKind = newproxy(true)

local ElementKindInternal = {
	Portal = Symbol.named("Portal"),
	Host = Symbol.named("Host"),
	Function = Symbol.named("Function"),
	Stateful = Symbol.named("Stateful"),
	Fragment = Symbol.named("Fragment"),
}

function ElementKindInternal.of(value)
	if typeof(value) ~= "table" then
		return nil
	end

	return value[ElementKind]
end

local componentTypesToKinds = {
	["string"] = ElementKindInternal.Host,
	["function"] = ElementKindInternal.Function,
	["table"] = ElementKindInternal.Stateful,
}

function ElementKindInternal.fromComponent(component)
	if component == Portal then
		return ElementKind.Portal
	else
		return componentTypesToKinds[typeof(component)]
	end
end

getmetatable(ElementKind).__index = ElementKindInternal

strict(ElementKindInternal, "ElementKind")

return ElementKind
