# Brainstorming ideas on Component declaration ```typescript= import { Fragment, h } from '@builder.io/qwik'; export const MyApp = () => <MouseDebuggerA />; export const HelloWorld = qComponent(({ render }) => { render(() => <span>HelloWorld</span>); }); // Ideas // 1. We should get rid of QComponent, instead the state should be the reference. // 2. remove QRecord and replace with simple QObject export const useMousePosition = qEffect(({ listen, createState, handle }) => { createState(() => ({ x: 0, y: 0 })); listen( 'document:mousemove', handle(({ state, event }) => { state.x = event.x; state.y = event.y; }) ); }); // NOTES: // 1. I like that the qComponent turns into a single closure which the developer can edit. // Tooling knows how to collapse it etc. Feels like a class without the class. // 2. If devs want to break up the code they can do so out into the closure // 3. PROBLEM: If fn gets extracted (say handler) into qComponet top level when the tooling // pulls it out it creates an issue as those functions can't call other functions in the closure export const MouseDebuggerA = qComponent<{}, { count: number; mouse: { x: number; y: number } }>( ({ createState, render, handle }) => { const increment1 = handle(({ state }) => state.count++); createState(() => ({ mouse: useMousePosition(), count: 0, })); render(({ state }) => ( <> Mouse: ({state.mouse.x}, {state.mouse.y})<button on:click={increment1}>+</button> </> )); } ); // NOTES: // 1. because functions are already top level, it is easy to move them by the tooling. export const MouseDebuggerB = qComponentB<{}, { count: number; mouse: { x: number; y: number } }>({ createState: qrl(() => ({ mouse: useMousePosition(), count: 0, })), render: qrl(({ state }) => ( <> Mouse: ({state.mouse.x}, {state.mouse.y})<button on:click={increment1}>+</button> </> )), }); const increment1 = qrlHandler<typeof MouseDebuggerB>(({ state }) => state.count++); //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// interface QComponent<PROPS = {}, STATE = {}, REF = {}> { __props__: PROPS; __state__: STATE; __ref__: REF; (props: any): any; } interface Qrl<T> { __brand__: T; } function use(element: HTMLElement, ref: any) { console.log(element, ref); } function qrl<T>(fn: T): Qrl<T> { console.log(fn); return null!; } function qrlHandler<COMP extends { __props__: any; __state__: any; __ref__: any }>( fn: ({ state }: { state: StateOf<COMP> }) => void ): Qrl<({ state }: { state: StateOf<COMP> }) => void> { console.log(fn); return null!; } export type StateOf<COMP extends { __props__: any; __state__: any; __ref__: any }> = COMP extends { __props__: any; __state__: infer STATE; __ref__: any; } ? STATE : never; function qComponent<PROPS = {}, STATE = {}, REF = {}>( fn: ({ createState, render, handle, }: { createState: (fn: ({ element }: { element: HTMLElement }) => STATE) => void; render: (fn: ({ state }: { state: STATE }) => any) => void; handle: (fn: ({ state }: { state: STATE }) => void) => Qrl<any>; }) => void ): { __props__: PROPS; __state__: STATE; __ref__: REF; (props: any): any; } { console.log(fn); return null!; } function qComponentB<PROPS = {}, STATE = {}, REF = {}>(def: { createState?: Qrl<({ element }: { element: HTMLElement }) => STATE>; render?: Qrl<({ state }: { state: STATE }) => any>; }): { __props__: PROPS; __state__: STATE; __ref__: REF; (props: any): any; } { console.log(def); return null!; } ```