+export const Button =()=>
+{
+ const [stateGet, stateSet] = React.useContext(CTX);
+ return <>
{JSON.stringify(stateGet)}
-
}>
-
hello
-
hello
-
hello
-
hello
-
hello
-
hello
-
hello
-
-
;
-
+ >;
};
+
+type DoneCallback =(openState:boolean)=>void;
+export type CollapseControls =(inOpen?:boolean, inMs?:number, inDone?:DoneCallback)=>void;
+export function Collapser(inElement:HTMLElement, initialState = false)
+{
+ let userDone:DoneCallback = (openState) => {};
+ let userMode = initialState;
+ let frameRequest = 0;
+
+ const done = (inEvent:TransitionEvent)=>
+ {
+ if (inEvent.propertyName == "height" && inEvent.target == inElement)
+ {
+ inEvent.stopPropagation();
+ if (userMode)
+ {
+ inElement.style.height = "auto";
+ inElement.style.overflow = "visible";
+ }
+ userDone(userMode);
+ }
+ };
+ inElement.addEventListener("transitionend", done);
+
+ return function(inOpen, inMs, inDone)
+ {
+ cancelAnimationFrame(frameRequest);
+
+ if(arguments.length)
+ {
+ userDone = inDone|| ((m)=>{}) as DoneCallback;
+ userMode = inOpen === true;
+
+ inElement.style.height = inElement.clientHeight + "px";
+ inElement.style.overflow = "hidden";
+ inElement.style.transition = "none";
+ frameRequest = requestAnimationFrame(()=>
+ {
+ inElement.style.transition = `height ${(inMs||1000) / 1000}s`;
+ frameRequest = requestAnimationFrame(()=>
+ {
+ inElement.style.height = `${inOpen ? inElement.scrollHeight : 0}px`;
+ });
+
+ });
+ }
+ else
+ {
+ inElement.removeEventListener("transitionend", done);
+ }
+ } as CollapseControls;
+}
\ No newline at end of file