local D=require(script.Parent.Symbol)local F=require(script.Parent.strict)local t=require(script.Parent.Portal)local v=newproxy(true)local G={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 G.of(D)if typeof(D)~="\116\097\098\108\101"then return nil end return D[v]end local u={string=G.Host;["\102\117\110\099\116\105\111\110"]=G.Function,table=G.Stateful}function G.fromComponent(D)if D==t then return v.Portal else return u[typeof(D)]end end;(getmetatable(v)).__index=G F(G,"\069\108\101\109\101\110\116\075\105\110\100")return v
--[[
	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