import React from "@rbxts/react"; import { ControlGroup } from "../ControlTypings/ControlUtils"; import { IsDatatype } from "../ControlTypings/Datatypes"; import { IsPrimitive } from "../ControlTypings/Primitives"; import { AllControls, ControlsList, ObjectControl, ReturnControls } from "../ControlTypings/Typing"; import { Signal } from "../Libraries/Signal"; import ReactRoblox from "@rbxts/react-roblox"; import Roact from "@rbxts/roact"; interface Storybook { name?: string; storyRoots: Instance[]; groupRoots?: boolean; // Will be ignored, dont use it react?: typeof React; reactRoblox?: typeof ReactRoblox; roact?: typeof Roact; } interface InputSignals { InputBegan: Signal<[input: InputObject, gameProcessed: boolean]>; InputEnded: Signal<[input: InputObject, gameProcessed: boolean]>; InputChanged: Signal<[input: InputObject, gameProcessed: boolean]>; MouseMoved: Signal<[mousePos: Vector2]>; GetMouseLocation(): Vector2; } interface StoryBase { name?: string; summary?: string; cleanup?: () => void; } type InferControlType = T extends IsPrimitive ? T : T extends IsDatatype ? T : T extends ObjectControl ? T["ControlValue"] : never; type InferControlGroup = { [K in keyof T]: InferControlType; }; type InferControls = { [K in keyof T]: T[K] extends ControlGroup ? InferControlGroup : T[K] extends AllControls ? InferControlType : never; }; type StoryProps = { controls: T extends ReturnControls ? InferControls : never; }; type GetStoryProps = ExcludeMembers; type InferProps = GetStoryProps>; interface IntrinsicProps { inputListener: InputSignals; target: Frame; } type StoryCreation = (props: T) => C; interface StoryControls { controls: T; } type StoryInfo = Partial>; interface StoryCreationKey { story: StoryCreation; } type StoryCleanup = () => void; type FunctionStory = (target: Frame) => StoryCleanup;