@object-ui/providers 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +4 -0
- package/LICENSE +21 -0
- package/README.md +71 -0
- package/dist/DataSourceProvider.d.ts +12 -0
- package/dist/DataSourceProvider.js +22 -0
- package/dist/MetadataProvider.d.ts +19 -0
- package/dist/MetadataProvider.js +44 -0
- package/dist/ThemeProvider.d.ts +17 -0
- package/dist/ThemeProvider.js +49 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +8 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.js +1 -0
- package/package.json +44 -0
- package/src/DataSourceProvider.tsx +32 -0
- package/src/MetadataProvider.tsx +65 -0
- package/src/ThemeProvider.tsx +66 -0
- package/src/index.ts +16 -0
- package/src/types.ts +19 -0
- package/tsconfig.json +17 -0
- package/tsconfig.tsbuildinfo +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 ObjectQL
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# @object-ui/providers
|
|
2
|
+
|
|
3
|
+
**Reusable Context Providers for ObjectUI**
|
|
4
|
+
|
|
5
|
+
A collection of framework-agnostic React context providers that can be used by third-party systems without console dependencies.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm add @object-ui/providers
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Providers
|
|
14
|
+
|
|
15
|
+
### DataSourceProvider
|
|
16
|
+
|
|
17
|
+
Generic data source context that decouples ObjectUI from ObjectStack.
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { DataSourceProvider } from '@object-ui/providers';
|
|
21
|
+
|
|
22
|
+
<DataSourceProvider dataSource={myCustomDataSource}>
|
|
23
|
+
<App />
|
|
24
|
+
</DataSourceProvider>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### MetadataProvider
|
|
28
|
+
|
|
29
|
+
Schema/metadata management for objects, fields, and views.
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { MetadataProvider } from '@object-ui/providers';
|
|
33
|
+
|
|
34
|
+
<MetadataProvider metadata={myMetadata}>
|
|
35
|
+
<App />
|
|
36
|
+
</MetadataProvider>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### ThemeProvider
|
|
40
|
+
|
|
41
|
+
Theme management with system theme detection.
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
import { ThemeProvider } from '@object-ui/providers';
|
|
45
|
+
|
|
46
|
+
<ThemeProvider defaultTheme="system" storageKey="my-app-theme">
|
|
47
|
+
<App />
|
|
48
|
+
</ThemeProvider>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Usage Example
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
import { DataSourceProvider, MetadataProvider, ThemeProvider } from '@object-ui/providers';
|
|
55
|
+
|
|
56
|
+
function App() {
|
|
57
|
+
return (
|
|
58
|
+
<ThemeProvider>
|
|
59
|
+
<DataSourceProvider dataSource={myDataSource}>
|
|
60
|
+
<MetadataProvider metadata={myMetadata}>
|
|
61
|
+
{/* Your app components */}
|
|
62
|
+
</MetadataProvider>
|
|
63
|
+
</DataSourceProvider>
|
|
64
|
+
</ThemeProvider>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## License
|
|
70
|
+
|
|
71
|
+
MIT
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DataSourceProviderProps } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* DataSourceProvider - Generic data source context
|
|
4
|
+
*
|
|
5
|
+
* Provides data source to child components without coupling to ObjectStack.
|
|
6
|
+
* Third-party systems can inject their own data adapters.
|
|
7
|
+
*/
|
|
8
|
+
export declare function DataSourceProvider({ dataSource, children, }: DataSourceProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
/**
|
|
10
|
+
* Hook to access data source from context
|
|
11
|
+
*/
|
|
12
|
+
export declare function useDataSource(): any;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
const DataSourceContext = createContext(null);
|
|
4
|
+
/**
|
|
5
|
+
* DataSourceProvider - Generic data source context
|
|
6
|
+
*
|
|
7
|
+
* Provides data source to child components without coupling to ObjectStack.
|
|
8
|
+
* Third-party systems can inject their own data adapters.
|
|
9
|
+
*/
|
|
10
|
+
export function DataSourceProvider({ dataSource, children, }) {
|
|
11
|
+
return (_jsx(DataSourceContext.Provider, { value: dataSource, children: children }));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Hook to access data source from context
|
|
15
|
+
*/
|
|
16
|
+
export function useDataSource() {
|
|
17
|
+
const context = useContext(DataSourceContext);
|
|
18
|
+
if (!context) {
|
|
19
|
+
throw new Error('useDataSource must be used within DataSourceProvider');
|
|
20
|
+
}
|
|
21
|
+
return context;
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MetadataProviderProps } from './types';
|
|
2
|
+
interface MetadataContextValue {
|
|
3
|
+
metadata: any;
|
|
4
|
+
loading: boolean;
|
|
5
|
+
error: string | null;
|
|
6
|
+
refetch: () => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* MetadataProvider - Schema/metadata management
|
|
10
|
+
*
|
|
11
|
+
* Provides application metadata (objects, fields, views) to child components.
|
|
12
|
+
* Can work with static metadata or fetch from API.
|
|
13
|
+
*/
|
|
14
|
+
export declare function MetadataProvider({ metadata: initialMetadata, children, }: MetadataProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
/**
|
|
16
|
+
* Hook to access metadata from context
|
|
17
|
+
*/
|
|
18
|
+
export declare function useMetadata(): MetadataContextValue;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useState, useEffect } from 'react';
|
|
3
|
+
const MetadataContext = createContext(null);
|
|
4
|
+
/**
|
|
5
|
+
* MetadataProvider - Schema/metadata management
|
|
6
|
+
*
|
|
7
|
+
* Provides application metadata (objects, fields, views) to child components.
|
|
8
|
+
* Can work with static metadata or fetch from API.
|
|
9
|
+
*/
|
|
10
|
+
export function MetadataProvider({ metadata: initialMetadata, children, }) {
|
|
11
|
+
const [metadata, setMetadata] = useState(initialMetadata || null);
|
|
12
|
+
const [loading, setLoading] = useState(!initialMetadata);
|
|
13
|
+
const refetch = () => {
|
|
14
|
+
// Placeholder for refetch logic
|
|
15
|
+
setLoading(true);
|
|
16
|
+
// In real implementation, this would call the API
|
|
17
|
+
setTimeout(() => {
|
|
18
|
+
setLoading(false);
|
|
19
|
+
}, 100);
|
|
20
|
+
};
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
if (initialMetadata) {
|
|
23
|
+
setMetadata(initialMetadata);
|
|
24
|
+
setLoading(false);
|
|
25
|
+
}
|
|
26
|
+
}, [initialMetadata]);
|
|
27
|
+
const value = {
|
|
28
|
+
metadata,
|
|
29
|
+
loading,
|
|
30
|
+
error: null,
|
|
31
|
+
refetch,
|
|
32
|
+
};
|
|
33
|
+
return (_jsx(MetadataContext.Provider, { value: value, children: children }));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Hook to access metadata from context
|
|
37
|
+
*/
|
|
38
|
+
export function useMetadata() {
|
|
39
|
+
const context = useContext(MetadataContext);
|
|
40
|
+
if (!context) {
|
|
41
|
+
throw new Error('useMetadata must be used within MetadataProvider');
|
|
42
|
+
}
|
|
43
|
+
return context;
|
|
44
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Theme, ThemeProviderProps } from './types';
|
|
2
|
+
interface ThemeContextValue {
|
|
3
|
+
theme: Theme;
|
|
4
|
+
setTheme: (theme: Theme) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* ThemeProvider - Theme management
|
|
8
|
+
*
|
|
9
|
+
* Provides theme context and handles system theme detection.
|
|
10
|
+
* Extracted from console for reuse in third-party applications.
|
|
11
|
+
*/
|
|
12
|
+
export declare function ThemeProvider({ defaultTheme, storageKey, children, }: ThemeProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
/**
|
|
14
|
+
* Hook to access theme from context
|
|
15
|
+
*/
|
|
16
|
+
export declare function useTheme(): ThemeContextValue;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useEffect, useState } from 'react';
|
|
3
|
+
const ThemeContext = createContext(null);
|
|
4
|
+
/**
|
|
5
|
+
* ThemeProvider - Theme management
|
|
6
|
+
*
|
|
7
|
+
* Provides theme context and handles system theme detection.
|
|
8
|
+
* Extracted from console for reuse in third-party applications.
|
|
9
|
+
*/
|
|
10
|
+
export function ThemeProvider({ defaultTheme = 'system', storageKey = 'ui-theme', children, }) {
|
|
11
|
+
const [theme, setTheme] = useState(() => {
|
|
12
|
+
if (typeof window !== 'undefined') {
|
|
13
|
+
return localStorage.getItem(storageKey) || defaultTheme;
|
|
14
|
+
}
|
|
15
|
+
return defaultTheme;
|
|
16
|
+
});
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
const root = window.document.documentElement;
|
|
19
|
+
root.classList.remove('light', 'dark');
|
|
20
|
+
if (theme === 'system') {
|
|
21
|
+
const systemTheme = window.matchMedia('(prefers-color-scheme: dark)')
|
|
22
|
+
.matches
|
|
23
|
+
? 'dark'
|
|
24
|
+
: 'light';
|
|
25
|
+
root.classList.add(systemTheme);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
root.classList.add(theme);
|
|
29
|
+
}
|
|
30
|
+
}, [theme]);
|
|
31
|
+
const value = {
|
|
32
|
+
theme,
|
|
33
|
+
setTheme: (newTheme) => {
|
|
34
|
+
localStorage.setItem(storageKey, newTheme);
|
|
35
|
+
setTheme(newTheme);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
return (_jsx(ThemeContext.Provider, { value: value, children: children }));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Hook to access theme from context
|
|
42
|
+
*/
|
|
43
|
+
export function useTheme() {
|
|
44
|
+
const context = useContext(ThemeContext);
|
|
45
|
+
if (!context) {
|
|
46
|
+
throw new Error('useTheme must be used within ThemeProvider');
|
|
47
|
+
}
|
|
48
|
+
return context;
|
|
49
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @object-ui/providers
|
|
3
|
+
*
|
|
4
|
+
* Reusable context providers for ObjectUI applications
|
|
5
|
+
*/
|
|
6
|
+
export { DataSourceProvider, useDataSource } from './DataSourceProvider';
|
|
7
|
+
export { MetadataProvider, useMetadata } from './MetadataProvider';
|
|
8
|
+
export { ThemeProvider, useTheme } from './ThemeProvider';
|
|
9
|
+
export type { DataSourceProviderProps, MetadataProviderProps, ThemeProviderProps, Theme, } from './types';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @object-ui/providers
|
|
3
|
+
*
|
|
4
|
+
* Reusable context providers for ObjectUI applications
|
|
5
|
+
*/
|
|
6
|
+
export { DataSourceProvider, useDataSource } from './DataSourceProvider';
|
|
7
|
+
export { MetadataProvider, useMetadata } from './MetadataProvider';
|
|
8
|
+
export { ThemeProvider, useTheme } from './ThemeProvider';
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export interface DataSourceProviderProps {
|
|
3
|
+
dataSource: any;
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
}
|
|
6
|
+
export interface MetadataProviderProps {
|
|
7
|
+
metadata?: any;
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
export type Theme = 'light' | 'dark' | 'system';
|
|
11
|
+
export interface ThemeProviderProps {
|
|
12
|
+
defaultTheme?: Theme;
|
|
13
|
+
storageKey?: string;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@object-ui/providers",
|
|
3
|
+
"version": "3.3.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"description": "Reusable context providers for ObjectUI applications",
|
|
7
|
+
"homepage": "https://www.objectui.org",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/objectstack-ai/objectui.git",
|
|
11
|
+
"directory": "packages/providers"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/objectstack-ai/objectui/issues"
|
|
15
|
+
},
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"module": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": "./dist/index.js",
|
|
23
|
+
"default": "./dist/index.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@object-ui/types": "3.3.0"
|
|
28
|
+
},
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
31
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/react": "19.2.14",
|
|
35
|
+
"@types/react-dom": "19.2.3",
|
|
36
|
+
"typescript": "^6.0.2"
|
|
37
|
+
},
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc",
|
|
40
|
+
"test": "vitest run",
|
|
41
|
+
"type-check": "tsc --noEmit",
|
|
42
|
+
"lint": "eslint ."
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import type { DataSourceProviderProps } from './types';
|
|
3
|
+
|
|
4
|
+
const DataSourceContext = createContext<any>(null);
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* DataSourceProvider - Generic data source context
|
|
8
|
+
*
|
|
9
|
+
* Provides data source to child components without coupling to ObjectStack.
|
|
10
|
+
* Third-party systems can inject their own data adapters.
|
|
11
|
+
*/
|
|
12
|
+
export function DataSourceProvider({
|
|
13
|
+
dataSource,
|
|
14
|
+
children,
|
|
15
|
+
}: DataSourceProviderProps) {
|
|
16
|
+
return (
|
|
17
|
+
<DataSourceContext.Provider value={dataSource}>
|
|
18
|
+
{children}
|
|
19
|
+
</DataSourceContext.Provider>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Hook to access data source from context
|
|
25
|
+
*/
|
|
26
|
+
export function useDataSource() {
|
|
27
|
+
const context = useContext(DataSourceContext);
|
|
28
|
+
if (!context) {
|
|
29
|
+
throw new Error('useDataSource must be used within DataSourceProvider');
|
|
30
|
+
}
|
|
31
|
+
return context;
|
|
32
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { createContext, useContext, useState, useEffect } from 'react';
|
|
2
|
+
import type { MetadataProviderProps } from './types';
|
|
3
|
+
|
|
4
|
+
interface MetadataContextValue {
|
|
5
|
+
metadata: any;
|
|
6
|
+
loading: boolean;
|
|
7
|
+
error: string | null;
|
|
8
|
+
refetch: () => void;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const MetadataContext = createContext<MetadataContextValue | null>(null);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* MetadataProvider - Schema/metadata management
|
|
15
|
+
*
|
|
16
|
+
* Provides application metadata (objects, fields, views) to child components.
|
|
17
|
+
* Can work with static metadata or fetch from API.
|
|
18
|
+
*/
|
|
19
|
+
export function MetadataProvider({
|
|
20
|
+
metadata: initialMetadata,
|
|
21
|
+
children,
|
|
22
|
+
}: MetadataProviderProps) {
|
|
23
|
+
const [metadata, setMetadata] = useState(initialMetadata || null);
|
|
24
|
+
const [loading, setLoading] = useState(!initialMetadata);
|
|
25
|
+
|
|
26
|
+
const refetch = () => {
|
|
27
|
+
// Placeholder for refetch logic
|
|
28
|
+
setLoading(true);
|
|
29
|
+
// In real implementation, this would call the API
|
|
30
|
+
setTimeout(() => {
|
|
31
|
+
setLoading(false);
|
|
32
|
+
}, 100);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (initialMetadata) {
|
|
37
|
+
setMetadata(initialMetadata);
|
|
38
|
+
setLoading(false);
|
|
39
|
+
}
|
|
40
|
+
}, [initialMetadata]);
|
|
41
|
+
|
|
42
|
+
const value: MetadataContextValue = {
|
|
43
|
+
metadata,
|
|
44
|
+
loading,
|
|
45
|
+
error: null,
|
|
46
|
+
refetch,
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<MetadataContext.Provider value={value}>
|
|
51
|
+
{children}
|
|
52
|
+
</MetadataContext.Provider>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Hook to access metadata from context
|
|
58
|
+
*/
|
|
59
|
+
export function useMetadata() {
|
|
60
|
+
const context = useContext(MetadataContext);
|
|
61
|
+
if (!context) {
|
|
62
|
+
throw new Error('useMetadata must be used within MetadataProvider');
|
|
63
|
+
}
|
|
64
|
+
return context;
|
|
65
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createContext, useContext, useEffect, useState } from 'react';
|
|
2
|
+
import type { Theme, ThemeProviderProps } from './types';
|
|
3
|
+
|
|
4
|
+
interface ThemeContextValue {
|
|
5
|
+
theme: Theme;
|
|
6
|
+
setTheme: (theme: Theme) => void;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const ThemeContext = createContext<ThemeContextValue | null>(null);
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* ThemeProvider - Theme management
|
|
13
|
+
*
|
|
14
|
+
* Provides theme context and handles system theme detection.
|
|
15
|
+
* Extracted from console for reuse in third-party applications.
|
|
16
|
+
*/
|
|
17
|
+
export function ThemeProvider({
|
|
18
|
+
defaultTheme = 'system',
|
|
19
|
+
storageKey = 'ui-theme',
|
|
20
|
+
children,
|
|
21
|
+
}: ThemeProviderProps) {
|
|
22
|
+
const [theme, setTheme] = useState<Theme>(() => {
|
|
23
|
+
if (typeof window !== 'undefined') {
|
|
24
|
+
return (localStorage.getItem(storageKey) as Theme) || defaultTheme;
|
|
25
|
+
}
|
|
26
|
+
return defaultTheme;
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
const root = window.document.documentElement;
|
|
31
|
+
root.classList.remove('light', 'dark');
|
|
32
|
+
|
|
33
|
+
if (theme === 'system') {
|
|
34
|
+
const systemTheme = window.matchMedia('(prefers-color-scheme: dark)')
|
|
35
|
+
.matches
|
|
36
|
+
? 'dark'
|
|
37
|
+
: 'light';
|
|
38
|
+
root.classList.add(systemTheme);
|
|
39
|
+
} else {
|
|
40
|
+
root.classList.add(theme);
|
|
41
|
+
}
|
|
42
|
+
}, [theme]);
|
|
43
|
+
|
|
44
|
+
const value: ThemeContextValue = {
|
|
45
|
+
theme,
|
|
46
|
+
setTheme: (newTheme: Theme) => {
|
|
47
|
+
localStorage.setItem(storageKey, newTheme);
|
|
48
|
+
setTheme(newTheme);
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Hook to access theme from context
|
|
59
|
+
*/
|
|
60
|
+
export function useTheme() {
|
|
61
|
+
const context = useContext(ThemeContext);
|
|
62
|
+
if (!context) {
|
|
63
|
+
throw new Error('useTheme must be used within ThemeProvider');
|
|
64
|
+
}
|
|
65
|
+
return context;
|
|
66
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @object-ui/providers
|
|
3
|
+
*
|
|
4
|
+
* Reusable context providers for ObjectUI applications
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export { DataSourceProvider, useDataSource } from './DataSourceProvider';
|
|
8
|
+
export { MetadataProvider, useMetadata } from './MetadataProvider';
|
|
9
|
+
export { ThemeProvider, useTheme } from './ThemeProvider';
|
|
10
|
+
|
|
11
|
+
export type {
|
|
12
|
+
DataSourceProviderProps,
|
|
13
|
+
MetadataProviderProps,
|
|
14
|
+
ThemeProviderProps,
|
|
15
|
+
Theme,
|
|
16
|
+
} from './types';
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
export interface DataSourceProviderProps {
|
|
4
|
+
dataSource: any;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface MetadataProviderProps {
|
|
9
|
+
metadata?: any;
|
|
10
|
+
children: ReactNode;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type Theme = 'light' | 'dark' | 'system';
|
|
14
|
+
|
|
15
|
+
export interface ThemeProviderProps {
|
|
16
|
+
defaultTheme?: Theme;
|
|
17
|
+
storageKey?: string;
|
|
18
|
+
children: ReactNode;
|
|
19
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"outDir": "dist",
|
|
5
|
+
"rootDir": "src",
|
|
6
|
+
"jsx": "react-jsx",
|
|
7
|
+
"lib": ["ES2020", "DOM"],
|
|
8
|
+
"noEmit": false,
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"composite": true
|
|
11
|
+
},
|
|
12
|
+
"include": ["src"],
|
|
13
|
+
"exclude": ["node_modules", "dist", "**/*.test.ts", "**/*.test.tsx"],
|
|
14
|
+
"references": [
|
|
15
|
+
{ "path": "../types" }
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@6.0.2/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/@types+react@19.2.14/node_modules/@types/react/global.d.ts","../../node_modules/.pnpm/csstype@3.2.3/node_modules/csstype/index.d.ts","../../node_modules/.pnpm/@types+react@19.2.14/node_modules/@types/react/index.d.ts","../../node_modules/.pnpm/@types+react@19.2.14/node_modules/@types/react/jsx-runtime.d.ts","./src/types.ts","./src/DataSourceProvider.tsx","./src/MetadataProvider.tsx","./src/ThemeProvider.tsx","./src/index.ts"],"fileIdsList":[[47,48],[49],[49,50,51],[50,51,52,53,54],[49,50]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"7e29f41b158de217f94cb9676bf9cbd0cd9b5a46e1985141ed36e075c52bf6ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac51dd7d31333793807a6abaa5ae168512b6131bd41d9c5b98477fc3b7800f9f","impliedFormat":1},{"version":"dc0a7f107690ee5cd8afc8dbf05c4df78085471ce16bdd9881642ec738bc81fe","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"b26da208ea41796114cb85799990ef399e9fcd9ec544349000cc30ace4f94da1","signature":"e430bc69296c5449ecdb0eb74711311d03f67a7c7abd5fa0a6606bd86ea27809"},{"version":"9a86cca021b797bf29e7510c27c3a4d38df2b0ce5a8a96d1e15436e1f43cd5e0","signature":"6fcf2e4cc4983f6cba0c8a9aa1be205f6490dca64eb2d59678859295c631c67a"},{"version":"b95ff9f9f708f1c9ef1791853f15e1e2c15be55fb74d297e41f96842c4a9d295","signature":"dcfda19e2be564129432b3f9bfa69367c98c364af478c87ee6276fa0af3dfcbd"},{"version":"6293ea890486000000aede17c4676adfd88a234ced3b33d2bbb141d0d9117a53","signature":"bb47a815a487b27f41fa03ae48300984dabf69f9b7264443899bd1a3e65c0a86"},{"version":"994a82d1455802e295593a4761619e2d79d0db066ae14812ede3aaa0a3a92bf0","signature":"6ca41a33fb15521605c6e98d03d59d9b64f8ec5442ab73dc9db05553a2615cad"}],"root":[[51,55]],"options":{"composite":true,"declaration":true,"jsx":4,"module":99,"noFallthroughCasesInSwitch":true,"noUnusedLocals":false,"noUnusedParameters":true,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"strict":true,"target":7,"useDefineForClassFields":true},"referencedMap":[[49,1],[50,2],[52,3],[53,3],[54,3],[55,4],[51,5]],"latestChangedDtsFile":"./dist/index.d.ts","version":"6.0.2"}
|