@datalayer/core 1.0.1 → 1.0.2

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.
@@ -0,0 +1,166 @@
1
+ /*
2
+ * Copyright (c) 2023-2025 Datalayer, Inc.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+ /**
6
+ * Hook for fetching and managing projects.
7
+ *
8
+ * Projects are backed by the Spacer service as spaces with type_s="project".
9
+ * Projects persist forever — only agents can terminate.
10
+ *
11
+ * Free tier limits: max 3 projects per user.
12
+ *
13
+ * @module hooks/useProjects
14
+ */
15
+ import { useMemo, useCallback } from 'react';
16
+ import { useCache } from './useCache';
17
+ /** The space type value used to identify project spaces in Solr */
18
+ export const PROJECT_SPACE_VARIANT = 'project';
19
+ /**
20
+ * Hook to fetch user's projects (spaces with type "project").
21
+ *
22
+ * Uses the spacer service's spaces endpoint filtered by type.
23
+ */
24
+ export function useProjects() {
25
+ const { useUserSpaces } = useCache();
26
+ const { data: allSpaces, ...rest } = useUserSpaces();
27
+ // Filter to only project-type spaces
28
+ const projects = useMemo(() => {
29
+ if (!allSpaces)
30
+ return [];
31
+ return allSpaces
32
+ .filter((space) => space.variant === PROJECT_SPACE_VARIANT ||
33
+ space.type_s === PROJECT_SPACE_VARIANT)
34
+ .map((space) => ({
35
+ uid: space.uid,
36
+ id: space.id ?? space.uid,
37
+ handle: space.handle ?? space.handle_s,
38
+ name: space.name ?? space.name_t,
39
+ description: space.description ?? space.description_t ?? '',
40
+ createdAt: space.created_at ? new Date(space.created_at) : new Date(),
41
+ isPublic: space.public ?? space.public_b ?? false,
42
+ attachedAgentPodName: space.attached_agent_pod_name_s || undefined,
43
+ attachedAgentSpecId: space.attached_agent_spec_id_s || undefined,
44
+ }));
45
+ }, [allSpaces]);
46
+ return { data: projects, ...rest };
47
+ }
48
+ /**
49
+ * Hook to fetch a single project by UID.
50
+ */
51
+ export function useProject(uid) {
52
+ const { useSpace } = useCache();
53
+ // useSpace requires a string – pass empty string when uid is undefined
54
+ // (the query is disabled when spaceId is falsy inside useCache)
55
+ const { data: space, ...rest } = useSpace(uid ?? '');
56
+ const project = useMemo(() => {
57
+ if (!space)
58
+ return undefined;
59
+ const s = space;
60
+ return {
61
+ uid: s.uid,
62
+ id: s.id ?? s.uid,
63
+ handle: s.handle ?? s.handle_s,
64
+ name: s.name ?? s.name_t,
65
+ description: s.description ?? s.description_t ?? '',
66
+ createdAt: s.created_at ? new Date(s.created_at) : new Date(),
67
+ isPublic: s.public ?? s.public_b ?? false,
68
+ attachedAgentPodName: s.attached_agent_pod_name_s || undefined,
69
+ attachedAgentSpecId: s.attached_agent_spec_id_s || undefined,
70
+ };
71
+ }, [space]);
72
+ return { data: project, ...rest };
73
+ }
74
+ /**
75
+ * Hook to create a new project.
76
+ * Creates a space with type "project" via the spacer service.
77
+ */
78
+ export function useCreateProject() {
79
+ const { useCreateSpace } = useCache();
80
+ const createSpaceMutation = useCreateSpace();
81
+ const createProject = useCallback(async (request) => {
82
+ const spaceHandle = request.name
83
+ .toLowerCase()
84
+ .replace(/[^a-z0-9]+/g, '-')
85
+ .replace(/^-|-$/g, '');
86
+ return createSpaceMutation.mutateAsync({
87
+ space: {
88
+ name: request.name,
89
+ description: request.description || '',
90
+ handle: spaceHandle || `project-${Date.now()}`,
91
+ variant: PROJECT_SPACE_VARIANT,
92
+ public: false,
93
+ },
94
+ });
95
+ }, [createSpaceMutation]);
96
+ return {
97
+ ...createSpaceMutation,
98
+ createProject,
99
+ };
100
+ }
101
+ /**
102
+ * Hook to update a project (e.g. persist the attached agent pod name).
103
+ * Uses the spacer PUT endpoint via useUpdateSpace.
104
+ */
105
+ export function useUpdateProject() {
106
+ const { useUpdateSpace } = useCache();
107
+ const updateSpaceMutation = useUpdateSpace();
108
+ /** Assign an agent runtime to the project */
109
+ const assignAgent = useCallback(async (project, agentPodName, agentSpecId) => {
110
+ return updateSpaceMutation.mutateAsync({
111
+ id: project.id,
112
+ name: project.name,
113
+ description: project.description,
114
+ attached_agent_pod_name_s: agentPodName,
115
+ attached_agent_spec_id_s: agentSpecId || '',
116
+ });
117
+ }, [updateSpaceMutation]);
118
+ /** Rename a project */
119
+ const renameProject = useCallback(async (project, newName) => {
120
+ return updateSpaceMutation.mutateAsync({
121
+ id: project.id,
122
+ name: newName,
123
+ description: project.description,
124
+ });
125
+ }, [updateSpaceMutation]);
126
+ /** Remove the agent assignment from the project */
127
+ const unassignAgent = useCallback(async (project) => {
128
+ return updateSpaceMutation.mutateAsync({
129
+ id: project.id,
130
+ name: project.name,
131
+ description: project.description,
132
+ attached_agent_pod_name_s: '',
133
+ attached_agent_spec_id_s: '',
134
+ });
135
+ }, [updateSpaceMutation]);
136
+ return {
137
+ ...updateSpaceMutation,
138
+ assignAgent,
139
+ unassignAgent,
140
+ renameProject,
141
+ };
142
+ }
143
+ /**
144
+ * Hook to refresh the projects list.
145
+ */
146
+ export function useRefreshProjects() {
147
+ const { useRefreshUserSpaces } = useCache();
148
+ return useRefreshUserSpaces();
149
+ }
150
+ /**
151
+ * Hook to delete a project (space) and all its contents.
152
+ */
153
+ export function useDeleteProject() {
154
+ const { useDeleteSpace } = useCache();
155
+ return useDeleteSpace();
156
+ }
157
+ /**
158
+ * Hook to fetch the default notebook and document UIDs for a project.
159
+ *
160
+ * This calls the spacer `GET /spaces/{uid}/default-items` endpoint which
161
+ * returns the UID of the first notebook and first document in the space.
162
+ */
163
+ export function useProjectDefaultItems(projectUid) {
164
+ const { useSpaceDefaultItems } = useCache();
165
+ return useSpaceDefaultItems(projectUid);
166
+ }
package/lib/index.d.ts CHANGED
@@ -5,7 +5,6 @@ export * from './collaboration';
5
5
  export * from './services';
6
6
  export * from './navigation';
7
7
  export * from './hooks';
8
- export * from './theme';
9
8
  export { requestDatalayerAPI, RunResponseError, NetworkError, } from './api/DatalayerApi';
10
9
  export type { IRequestDatalayerAPIOptions } from './api/DatalayerApi';
11
10
  export { API_BASE_PATHS } from './api/constants';
package/lib/index.js CHANGED
@@ -11,8 +11,6 @@ export * from './services';
11
11
  // Export navigation before hooks to avoid conflicts
12
12
  export * from './navigation';
13
13
  export * from './hooks';
14
- // Export Theme.
15
- export * from './theme';
16
14
  // Export APIs.
17
15
  export { requestDatalayerAPI, RunResponseError, NetworkError, } from './api/DatalayerApi';
18
16
  export { API_BASE_PATHS } from './api/constants';
@@ -31,6 +31,8 @@ export type IPage = {
31
31
  creatorId?: string;
32
32
  kernelSnapshot?: IRuntimeSnapshot;
33
33
  kernelSnapshotId?: string;
34
+ createdAt?: string;
35
+ updatedAt?: string;
34
36
  };
35
37
  export declare const asPage: (s: any) => IPage;
36
38
  export default IPage;
@@ -48,6 +48,6 @@ const TokensTable = () => {
48
48
  };
49
49
  export const Tokens = () => {
50
50
  const navigate = useNavigate();
51
- return (_jsxs(PageLayout, { containerWidth: "full", padding: "normal", style: { overflow: 'visible', minHeight: 'calc(100vh - 45px)' }, children: [_jsx(PageLayout.Header, { children: _jsxs(PageHeader, { children: [_jsx(PageHeader.TitleArea, { variant: "large", children: _jsx(PageHeader.Title, { children: "Tokens" }) }), _jsx(PageHeader.Actions, { children: _jsx(Button, { size: "small", variant: "primary", onClick: e => navigate('/new/token', e), children: "New token" }) })] }) }), _jsx(PageLayout.Content, { children: _jsx(Box, { children: _jsx(TokensTable, {}) }) })] }));
51
+ return (_jsxs(PageLayout, { containerWidth: "full", padding: "normal", style: { overflow: 'visible', minHeight: 'calc(100vh - 45px)' }, children: [_jsx(PageLayout.Header, { children: _jsxs(PageHeader, { children: [_jsx(PageHeader.TitleArea, { variant: "large", children: _jsx(PageHeader.Title, { children: "Tokens" }) }), _jsx(PageHeader.Actions, { children: _jsx(Button, { size: "small", variant: "primary", onClick: e => navigate('/tokens/new', e), children: "New token" }) })] }) }), _jsx(PageLayout.Content, { children: _jsx(Box, { children: _jsx(TokensTable, {}) }) })] }));
52
52
  };
53
53
  export default Tokens;
@@ -43,6 +43,6 @@ const SecretsTable = () => {
43
43
  };
44
44
  export const Secrets = () => {
45
45
  const navigate = useNavigate();
46
- return (_jsxs(PageLayout, { containerWidth: "full", padding: "normal", style: { overflow: 'visible', minHeight: 'calc(100vh - 45px)' }, children: [_jsx(PageLayout.Header, { children: _jsxs(PageHeader, { children: [_jsx(PageHeader.TitleArea, { variant: "large", children: _jsx(PageHeader.Title, { children: "Secrets" }) }), _jsx(PageHeader.Actions, { children: _jsx(Button, { size: "small", variant: "primary", onClick: e => navigate('/new/secret', e), children: "New secret" }) })] }) }), _jsx(PageLayout.Content, { children: _jsx(Box, { children: _jsx(SecretsTable, {}) }) })] }));
46
+ return (_jsxs(PageLayout, { containerWidth: "full", padding: "normal", style: { overflow: 'visible', minHeight: 'calc(100vh - 45px)' }, children: [_jsx(PageLayout.Header, { children: _jsxs(PageHeader, { children: [_jsx(PageHeader.TitleArea, { variant: "large", children: _jsx(PageHeader.Title, { children: "Secrets" }) }), _jsx(PageHeader.Actions, { children: _jsx(Button, { size: "small", variant: "primary", onClick: e => navigate('/secrets/new', e), children: "New secret" }) })] }) }), _jsx(PageLayout.Content, { children: _jsx(Box, { children: _jsx(SecretsTable, {}) }) })] }));
47
47
  };
48
48
  export default Secrets;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@datalayer/core",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "type": "module",
5
5
  "workspaces": [
6
6
  ".",
@@ -1,193 +0,0 @@
1
- /**
2
- * MCP Server tool configuration
3
- */
4
- export interface MCPServerTool {
5
- name: string;
6
- description: string;
7
- enabled: boolean;
8
- }
9
- /**
10
- * MCP Server configuration
11
- */
12
- export interface MCPServer {
13
- id: string;
14
- name: string;
15
- url?: string;
16
- enabled: boolean;
17
- tools: MCPServerTool[];
18
- command?: string;
19
- args: string[];
20
- isAvailable: boolean;
21
- transport: 'stdio' | 'http';
22
- }
23
- /**
24
- * Agent skill configuration
25
- */
26
- export interface AgentSkill {
27
- id: string;
28
- name: string;
29
- description: string;
30
- version: string;
31
- tags: string[];
32
- enabled: boolean;
33
- }
34
- /**
35
- * Agent specification model
36
- */
37
- export interface AgentSpec {
38
- id: string;
39
- name: string;
40
- description: string;
41
- tags: string[];
42
- enabled: boolean;
43
- mcpServers: MCPServer[];
44
- skills: AgentSkill[];
45
- environmentName: string;
46
- icon?: string;
47
- color?: string;
48
- /** Chat suggestions to show users what this agent can do */
49
- suggestions?: string[];
50
- }
51
- /**
52
- * Agent space status
53
- */
54
- export type AgentSpaceStatus = 'starting' | 'running' | 'paused' | 'terminated' | 'archived';
55
- /**
56
- * Agent space data
57
- */
58
- export interface AgentSpaceData {
59
- id: string;
60
- name: string;
61
- description: string;
62
- status: AgentSpaceStatus;
63
- isPublic: boolean;
64
- tags: string[];
65
- messageCount: number;
66
- createdAt?: string;
67
- updatedAt?: string;
68
- thumbnail?: string;
69
- lastMessage?: string;
70
- author?: string;
71
- avatarUrl?: string;
72
- stars?: number;
73
- podName?: string;
74
- runtimeUrl?: string;
75
- creatorUid?: string;
76
- creatorHandle?: string;
77
- agentSpec?: AgentSpec;
78
- }
79
- /**
80
- * Request to create an agent space
81
- */
82
- export interface CreateAgentSpaceRequest {
83
- /** Name of the agent space */
84
- name: string;
85
- /** Parent space ID */
86
- spaceId: string;
87
- /** Description */
88
- description?: string;
89
- /** Tags for categorization */
90
- tags?: string[];
91
- /** Initial status */
92
- status?: AgentSpaceStatus;
93
- /** Whether publicly visible */
94
- isPublic?: boolean;
95
- /** Agent specification */
96
- agentSpec?: AgentSpec;
97
- /** Thumbnail URL */
98
- thumbnail?: string;
99
- }
100
- /**
101
- * Request to update an agent space
102
- */
103
- export interface UpdateAgentSpaceRequest {
104
- name?: string;
105
- description?: string;
106
- tags?: string[];
107
- status?: AgentSpaceStatus;
108
- isPublic?: boolean;
109
- agentSpec?: AgentSpec;
110
- podName?: string;
111
- runtimeUrl?: string;
112
- messageCount?: number;
113
- lastMessage?: string;
114
- thumbnail?: string;
115
- }
116
- /**
117
- * Response for single agent space operations
118
- */
119
- export interface AgentSpaceResponse {
120
- success: boolean;
121
- message: string;
122
- agentSpace?: AgentSpaceData;
123
- }
124
- /**
125
- * Response for listing agent spaces
126
- */
127
- export interface AgentSpacesResponse {
128
- success: boolean;
129
- message: string;
130
- agentSpaces?: AgentSpaceData[];
131
- }
132
- /**
133
- * Create a new agent space.
134
- * @param token - Authentication token
135
- * @param data - Agent space creation configuration
136
- * @param baseUrl - Base URL for the API (defaults to production)
137
- * @returns Promise resolving to the created agent space response
138
- */
139
- export declare const createAgentSpace: (token: string, data: CreateAgentSpaceRequest, baseUrl?: string) => Promise<AgentSpaceResponse>;
140
- /**
141
- * List agent spaces for the current user.
142
- * @param token - Authentication token
143
- * @param baseUrl - Base URL for the API (defaults to production)
144
- * @returns Promise resolving to the list of agent spaces
145
- */
146
- export declare const listAgentSpaces: (token: string, baseUrl?: string) => Promise<AgentSpacesResponse>;
147
- /**
148
- * List all public agent spaces (Library).
149
- * @param baseUrl - Base URL for the API (defaults to production)
150
- * @returns Promise resolving to the list of public agent spaces
151
- */
152
- export declare const listPublicAgentSpaces: (baseUrl?: string) => Promise<AgentSpacesResponse>;
153
- /**
154
- * Get an agent space by UID.
155
- * @param token - Authentication token
156
- * @param uid - The agent space UID
157
- * @param baseUrl - Base URL for the API (defaults to production)
158
- * @returns Promise resolving to the agent space
159
- */
160
- export declare const getAgentSpace: (token: string, uid: string, baseUrl?: string) => Promise<AgentSpaceResponse>;
161
- /**
162
- * Update an agent space.
163
- * @param token - Authentication token
164
- * @param uid - The agent space UID
165
- * @param data - Update data
166
- * @param baseUrl - Base URL for the API (defaults to production)
167
- * @returns Promise resolving to the updated agent space
168
- */
169
- export declare const updateAgentSpace: (token: string, uid: string, data: UpdateAgentSpaceRequest, baseUrl?: string) => Promise<AgentSpaceResponse>;
170
- /**
171
- * Delete an agent space.
172
- * @param token - Authentication token
173
- * @param uid - The agent space UID
174
- * @param baseUrl - Base URL for the API (defaults to production)
175
- * @returns Promise resolving when deleted
176
- */
177
- export declare const deleteAgentSpace: (token: string, uid: string, baseUrl?: string) => Promise<void>;
178
- /**
179
- * Make an agent space public (add to Library).
180
- * @param token - Authentication token
181
- * @param uid - The agent space UID
182
- * @param baseUrl - Base URL for the API (defaults to production)
183
- * @returns Promise resolving to the updated agent space
184
- */
185
- export declare const makeAgentSpacePublic: (token: string, uid: string, baseUrl?: string) => Promise<AgentSpaceResponse>;
186
- /**
187
- * Make an agent space private (remove from Library).
188
- * @param token - Authentication token
189
- * @param uid - The agent space UID
190
- * @param baseUrl - Base URL for the API (defaults to production)
191
- * @returns Promise resolving to the updated agent space
192
- */
193
- export declare const makeAgentSpacePrivate: (token: string, uid: string, baseUrl?: string) => Promise<AgentSpaceResponse>;
@@ -1,127 +0,0 @@
1
- /*
2
- * Copyright (c) 2023-2025 Datalayer, Inc.
3
- * Distributed under the terms of the Modified BSD License.
4
- */
5
- /**
6
- * Agent Spaces API functions for the Datalayer platform.
7
- *
8
- * Provides functions for creating, listing, updating, and deleting agent spaces.
9
- *
10
- * @module api/spacer/agent-spaces
11
- */
12
- import { requestDatalayerAPI } from '../DatalayerApi';
13
- import { API_BASE_PATHS, DEFAULT_SERVICE_URLS } from '../constants';
14
- // =============================================================================
15
- // API Functions
16
- // =============================================================================
17
- /**
18
- * Create a new agent space.
19
- * @param token - Authentication token
20
- * @param data - Agent space creation configuration
21
- * @param baseUrl - Base URL for the API (defaults to production)
22
- * @returns Promise resolving to the created agent space response
23
- */
24
- export const createAgentSpace = async (token, data, baseUrl = DEFAULT_SERVICE_URLS.SPACER) => {
25
- return requestDatalayerAPI({
26
- url: `${baseUrl}${API_BASE_PATHS.SPACER}/agent-spaces`,
27
- method: 'POST',
28
- token,
29
- body: data,
30
- });
31
- };
32
- /**
33
- * List agent spaces for the current user.
34
- * @param token - Authentication token
35
- * @param baseUrl - Base URL for the API (defaults to production)
36
- * @returns Promise resolving to the list of agent spaces
37
- */
38
- export const listAgentSpaces = async (token, baseUrl = DEFAULT_SERVICE_URLS.SPACER) => {
39
- return requestDatalayerAPI({
40
- url: `${baseUrl}${API_BASE_PATHS.SPACER}/agent-spaces`,
41
- method: 'GET',
42
- token,
43
- });
44
- };
45
- /**
46
- * List all public agent spaces (Library).
47
- * @param baseUrl - Base URL for the API (defaults to production)
48
- * @returns Promise resolving to the list of public agent spaces
49
- */
50
- export const listPublicAgentSpaces = async (baseUrl = DEFAULT_SERVICE_URLS.SPACER) => {
51
- return requestDatalayerAPI({
52
- url: `${baseUrl}${API_BASE_PATHS.SPACER}/agent-spaces/public`,
53
- method: 'GET',
54
- });
55
- };
56
- /**
57
- * Get an agent space by UID.
58
- * @param token - Authentication token
59
- * @param uid - The agent space UID
60
- * @param baseUrl - Base URL for the API (defaults to production)
61
- * @returns Promise resolving to the agent space
62
- */
63
- export const getAgentSpace = async (token, uid, baseUrl = DEFAULT_SERVICE_URLS.SPACER) => {
64
- return requestDatalayerAPI({
65
- url: `${baseUrl}${API_BASE_PATHS.SPACER}/agent-spaces/${uid}`,
66
- method: 'GET',
67
- token,
68
- });
69
- };
70
- /**
71
- * Update an agent space.
72
- * @param token - Authentication token
73
- * @param uid - The agent space UID
74
- * @param data - Update data
75
- * @param baseUrl - Base URL for the API (defaults to production)
76
- * @returns Promise resolving to the updated agent space
77
- */
78
- export const updateAgentSpace = async (token, uid, data, baseUrl = DEFAULT_SERVICE_URLS.SPACER) => {
79
- return requestDatalayerAPI({
80
- url: `${baseUrl}${API_BASE_PATHS.SPACER}/agent-spaces/${uid}`,
81
- method: 'PUT',
82
- token,
83
- body: data,
84
- });
85
- };
86
- /**
87
- * Delete an agent space.
88
- * @param token - Authentication token
89
- * @param uid - The agent space UID
90
- * @param baseUrl - Base URL for the API (defaults to production)
91
- * @returns Promise resolving when deleted
92
- */
93
- export const deleteAgentSpace = async (token, uid, baseUrl = DEFAULT_SERVICE_URLS.SPACER) => {
94
- await requestDatalayerAPI({
95
- url: `${baseUrl}${API_BASE_PATHS.SPACER}/agent-spaces/${uid}`,
96
- method: 'DELETE',
97
- token,
98
- });
99
- };
100
- /**
101
- * Make an agent space public (add to Library).
102
- * @param token - Authentication token
103
- * @param uid - The agent space UID
104
- * @param baseUrl - Base URL for the API (defaults to production)
105
- * @returns Promise resolving to the updated agent space
106
- */
107
- export const makeAgentSpacePublic = async (token, uid, baseUrl = DEFAULT_SERVICE_URLS.SPACER) => {
108
- return requestDatalayerAPI({
109
- url: `${baseUrl}${API_BASE_PATHS.SPACER}/agent-spaces/${uid}/public`,
110
- method: 'POST',
111
- token,
112
- });
113
- };
114
- /**
115
- * Make an agent space private (remove from Library).
116
- * @param token - Authentication token
117
- * @param uid - The agent space UID
118
- * @param baseUrl - Base URL for the API (defaults to production)
119
- * @returns Promise resolving to the updated agent space
120
- */
121
- export const makeAgentSpacePrivate = async (token, uid, baseUrl = DEFAULT_SERVICE_URLS.SPACER) => {
122
- return requestDatalayerAPI({
123
- url: `${baseUrl}${API_BASE_PATHS.SPACER}/agent-spaces/${uid}/private`,
124
- method: 'POST',
125
- token,
126
- });
127
- };
@@ -1,52 +0,0 @@
1
- /**
2
- * Datalayer Accessible Color System
3
- * Based on Datalayer's brand manual - WCAG AA/AAA compliant
4
- */
5
- export declare const datalayerColors: {
6
- black: string;
7
- gray: string;
8
- white: string;
9
- greenBrand: string;
10
- greenAccent: string;
11
- greenText: string;
12
- greenTint: string;
13
- greenBright: string;
14
- greenHover: string;
15
- };
16
- export declare const datalayerTheme: {
17
- animation: {
18
- easeOutCubic: string;
19
- };
20
- borderWidths: (string | number)[];
21
- breakpoints: string[];
22
- fonts: {
23
- normal: any;
24
- mono: string;
25
- };
26
- fontSizes: string[];
27
- fontWeights: {
28
- light: number;
29
- normal: number;
30
- semibold: number;
31
- bold: number;
32
- };
33
- lineHeights: {
34
- condensedUltra: number;
35
- condensed: number;
36
- default: number;
37
- };
38
- radii: string[];
39
- sizes: {
40
- small: string;
41
- medium: string;
42
- large: string;
43
- xlarge: string;
44
- };
45
- space: string[];
46
- } & {
47
- colorSchemes: {
48
- light: {};
49
- dark: {};
50
- };
51
- };
52
- export default datalayerTheme;