Compare commits

..

No commits in common. "main" and "v1.7.1" have entirely different histories.
main ... v1.7.1

10 changed files with 861 additions and 1092 deletions

View file

@ -39,8 +39,6 @@ import {Await, useAsync} from "../src/Async";
import {NotifyErrorsBoundary} from "../src/Components/Errors/NotifyErrorsBoundary"; import {NotifyErrorsBoundary} from "../src/Components/Errors/NotifyErrorsBoundary";
import {DemoFailingComponent, DemoResetComponent} from "./DemoFailingComponent"; import {DemoFailingComponent, DemoResetComponent} from "./DemoFailingComponent";
import {Tip} from "../src/Components/Tips/Tip"; import {Tip} from "../src/Components/Tips/Tip";
import {useKernelContext} from "../src/KernelGlobalContext";
import {KernelContext} from "./DemoKernelContext";
export function DemoApp() export function DemoApp()
{ {
@ -75,8 +73,6 @@ export function DemoApp()
const [failingComponentsCount, setFailingComponentsCount] = useState(0); const [failingComponentsCount, setFailingComponentsCount] = useState(0);
const [kernelContext, setKernelContext] = useKernelContext(KernelContext);
return ( return (
<Application> <Application>
<MainMenu> <MainMenu>
@ -613,23 +609,6 @@ export function DemoApp()
</NotifyErrorsBoundary> </NotifyErrorsBoundary>
</Card> </Card>
<h2>
Global states
</h2>
<Card>
<label>
Kernel context data
<input type={"text"} name={"kernel-context-data"}
value={kernelContext}
onChange={(event) => setKernelContext(event.currentTarget.value)} />
</label>
<Buttons placement={"center"}>
<button type={"button"} onClick={easySubapp}>Open demo subapp to see if it works</button>
</Buttons>
</Card>
</Application> </Application>
); );
} }

View file

@ -1,6 +0,0 @@
import {createKernelContext} from "../src/KernelGlobalContext";
/**
* Create kernel context.
*/
export const KernelContext = createKernelContext("");

View file

@ -1,8 +1,6 @@
import React from "react"; import React from "react";
import {Subapp, useSubapp} from "../src/Components/Subapps/Subapps"; import {Subapp, useSubapp} from "../src/Components/Subapps/Subapps";
import {Card} from "../src/Components/Card"; import {Card} from "../src/Components/Card";
import {useKernelContext} from "../src/KernelGlobalContext";
import {KernelContext} from "./DemoKernelContext";
/** /**
* A demo Subapp component. * A demo Subapp component.
@ -12,9 +10,6 @@ export function DemoSubapp()
// Get subapp close function. // Get subapp close function.
const {uuid, close} = useSubapp(); const {uuid, close} = useSubapp();
// Get kernel context data.
const [kernelContext] = useKernelContext(KernelContext);
return ( return (
<Subapp title={"My complex subapp"}> <Subapp title={"My complex subapp"}>
<Card> <Card>
@ -22,8 +17,6 @@ export function DemoSubapp()
<p>UUID : <code>{uuid}</code></p> <p>UUID : <code>{uuid}</code></p>
{kernelContext && <p><strong>Kernel context data</strong>: <code>{kernelContext}</code></p>}
<button onClick={close}>Close the subapp</button> <button onClick={close}>Close the subapp</button>
</Card> </Card>
</Subapp> </Subapp>

View file

@ -49,5 +49,4 @@ export * from "./src/Components/Tips/Tip";
export * from "./src/Async"; export * from "./src/Async";
export * from "./src/GlobalState"; export * from "./src/GlobalState";
export * from "./src/KernelGlobalContext";
export * from "./src/Utils"; export * from "./src/Utils";

View file

@ -1,5 +1,5 @@
{ {
"version": "1.8.3", "version": "1.7.1",
"name": "@kernelui/core", "name": "@kernelui/core",
"description": "Kernel UI Core.", "description": "Kernel UI Core.",
"scripts": { "scripts": {
@ -27,24 +27,24 @@
}, },
"devDependencies": { "devDependencies": {
"@phosphor-icons/react": "^2.1.7", "@phosphor-icons/react": "^2.1.7",
"@types/node": "^22.7.4", "@types/node": "^20.14.10",
"@types/react": "^18.3.12", "@types/react": "^18.3.3",
"@types/react-dom": "^18.3.1", "@types/react-dom": "^18.3.0",
"@types/uuid": "^10", "@types/uuid": "^10",
"@vitejs/plugin-react": "^4.3.4", "@vitejs/plugin-react": "^4.3.0",
"less": "^4.2.0", "less": "^4.2.0",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-router-dom": "^7.0.1", "react-router-dom": "^6.24.1",
"typescript": "^5.6.2", "typescript": "^5.4.5",
"vite": "^6.0.1", "vite": "^5.2.11",
"vite-plugin-dts": "^4.3.0" "vite-plugin-dts": "^3.9.1"
}, },
"peerDependencies": { "peerDependencies": {
"@phosphor-icons/react": "^2.1.7", "@phosphor-icons/react": "^2.1.7",
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-router-dom": "^7.0.1" "react-router-dom": "^6.24.1"
}, },
"packageManager": "yarn@4.5.3" "packageManager": "yarn@4.5.0"
} }

View file

@ -3,7 +3,6 @@ import React from "react";
import {createBrowserRouter, RouterProvider} from "react-router-dom"; import {createBrowserRouter, RouterProvider} from "react-router-dom";
import {CurtainsProvider} from "../Components/Curtains/Curtains"; import {CurtainsProvider} from "../Components/Curtains/Curtains";
import {NotificationsProvider} from "../Components/Notifications/Notifications"; import {NotificationsProvider} from "../Components/Notifications/Notifications";
import {KernelGlobalContextProvider} from "../KernelGlobalContext";
/** /**
* Main Kernel UI app component which initializes everything. * Main Kernel UI app component which initializes everything.
@ -15,19 +14,17 @@ export function Kernel({header, footer, router}: {
}) })
{ {
return ( return (
<KernelGlobalContextProvider> <IconContext.Provider value={{
<IconContext.Provider value={{ size: "1em",
size: "1em", weight: "bold",
weight: "bold", }}>
}}> <NotificationsProvider>
<NotificationsProvider> <CurtainsProvider>
<CurtainsProvider> {header}
{header} <RouterProvider router={router} />
<RouterProvider router={router} /> {footer}
{footer} </CurtainsProvider>
</CurtainsProvider> </NotificationsProvider>
</NotificationsProvider> </IconContext.Provider>
</IconContext.Provider>
</KernelGlobalContextProvider>
); );
} }

View file

@ -1,133 +0,0 @@
import React, {useCallback, useContext, useMemo, useState} from "react";
import {v4 as uuidv4} from "uuid";
/**
* Create Kernel context.
* @param defaultValue Kernel context default value.
*/
export function createKernelContext<T>(defaultValue: T): KernelContext<T>
{
return {
uuid: uuidv4(),
defaultValue: defaultValue,
};
}
/**
* Kernel context definition object.
*/
export interface KernelContext<T>
{
/**
* Kernel context UUID.
*/
uuid: string;
/**
* Kernel context default value.
*/
defaultValue: T;
}
/**
* Kernel context setter function type.
*/
export type KernelContextSetter<IdentifierType extends string|symbol|number = string, ValueType = any> = (identifier: IdentifierType, value: ValueType) => void;
/**
* Kernel contexts type.
*/
export type KernelContexts = Record<string, any>;
/**
* Kernel context dispatcher function type.
*/
export type KernelContextDispatcher<ValueType = any> = (value: ValueType) => void;
/**
* Kernel global context data.
*/
export interface KernelGlobalContextData
{
contexts: KernelContexts;
setContext: KernelContextSetter;
}
/**
* React Kernel global context.
*/
export const KernelGlobalContext = React.createContext<KernelGlobalContextData>({
contexts: {},
setContext: () => {},
});
/**
* Kernel global context provider.
*/
export function KernelGlobalContextProvider({children}: React.PropsWithChildren<{}>)
{
// Kernel contexts initialization.
const [kernelContexts, setKernelContexts] = useState<KernelContexts>({});
/**
* Change kernel contexts.
*/
const changeKernelContexts = useCallback((kernelContextsUpdate: Partial<KernelContexts>) => {
setKernelContexts({
...kernelContexts,
...kernelContextsUpdate,
});
}, [kernelContexts, setKernelContexts]);
/**
* Kernel context setter function.
*/
const kernelContextSetter = useCallback((identifier: string, data: any) => (
changeKernelContexts({
[identifier]: data,
})
), [changeKernelContexts]);
// Initialize kernel global context value.
const kernelContextValue = useMemo<KernelGlobalContextData>(() => ({
contexts: kernelContexts,
setContext: kernelContextSetter,
}), [kernelContexts, kernelContextSetter]);
return (
<KernelGlobalContext.Provider value={kernelContextValue}>
{children}
</KernelGlobalContext.Provider>
);
}
/**
* Get kernel global context data.
*/
function useKernelGlobalContext(): KernelGlobalContextData
{
return useContext(KernelGlobalContext);
}
/**
* Initialize or get kernel context with given identifier.
* @param context Context object.
*/
export function useKernelContext<T>(context: KernelContext<T>): [T, KernelContextDispatcher<T>]
{
/**
* Get kernel global context.
*/
const kernelGlobalContext = useKernelGlobalContext();
/**
* Function to set kernel context.
*/
const setContext = useCallback(
(newValue: T) => kernelGlobalContext.setContext(context.uuid, newValue),
[kernelGlobalContext.setContext],
);
// Return kernel context and its dispatcher.
return [kernelGlobalContext.contexts?.[context.uuid] ?? context.defaultValue, setContext];
}

View file

@ -4,12 +4,6 @@ h1, h2, h3, h4, h5, h6
&.center, &.main &.center, &.main
{ text-align: center; } { text-align: center; }
> svg
{
position: relative;
bottom: -0.15em;
}
} }
h1 h1

View file

@ -23,7 +23,6 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
plugins: [ plugins: [
react(), react(),
dts({ dts({
rollupTypes: true,
insertTypesEntry: true, insertTypesEntry: true,
exclude: ["demo", "node_modules"], exclude: ["demo", "node_modules"],
}), }),

1729
yarn.lock

File diff suppressed because it is too large Load diff