@se-studio/core-ui 1.0.13 → 1.0.15
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/README.md +78 -14
- package/dist/CmsRendererConfig.d.ts +122 -0
- package/dist/CmsRendererConfig.d.ts.map +1 -1
- package/dist/analytics/AnalyticsProvider.d.ts +16 -0
- package/dist/analytics/AnalyticsProvider.d.ts.map +1 -0
- package/dist/analytics/AnalyticsProvider.js +22 -0
- package/dist/analytics/AnalyticsProvider.js.map +1 -0
- package/dist/analytics/adapters/ConsoleAnalyticsAdapter.d.ts +12 -0
- package/dist/analytics/adapters/ConsoleAnalyticsAdapter.d.ts.map +1 -0
- package/dist/analytics/adapters/ConsoleAnalyticsAdapter.js +21 -0
- package/dist/analytics/adapters/ConsoleAnalyticsAdapter.js.map +1 -0
- package/dist/analytics/adapters/index.d.ts +2 -0
- package/dist/analytics/adapters/index.d.ts.map +1 -0
- package/dist/analytics/adapters/index.js +2 -0
- package/dist/analytics/adapters/index.js.map +1 -0
- package/dist/analytics/types.d.ts +41 -0
- package/dist/analytics/types.d.ts.map +1 -0
- package/dist/analytics/types.js +2 -0
- package/dist/analytics/types.js.map +1 -0
- package/dist/analytics/useAnalytics.d.ts +45 -0
- package/dist/analytics/useAnalytics.d.ts.map +1 -0
- package/dist/analytics/useAnalytics.js +70 -0
- package/dist/analytics/useAnalytics.js.map +1 -0
- package/dist/components/ClientMonitor.d.ts +1 -0
- package/dist/components/ClientMonitor.d.ts.map +1 -1
- package/dist/components/ClientMonitor.js +223 -18
- package/dist/components/ClientMonitor.js.map +1 -1
- package/dist/components/CmsCollection.d.ts +47 -0
- package/dist/components/CmsCollection.d.ts.map +1 -1
- package/dist/components/CmsCollection.js +7 -0
- package/dist/components/CmsCollection.js.map +1 -1
- package/dist/components/CmsComponent.d.ts +47 -0
- package/dist/components/CmsComponent.d.ts.map +1 -1
- package/dist/components/CmsComponent.js +7 -0
- package/dist/components/CmsComponent.js.map +1 -1
- package/dist/components/CmsContent.d.ts +62 -0
- package/dist/components/CmsContent.d.ts.map +1 -1
- package/dist/components/CmsContent.js +53 -0
- package/dist/components/CmsContent.js.map +1 -1
- package/dist/components/CmsConversionErrors.js +2 -0
- package/dist/components/CmsConversionErrors.js.map +1 -1
- package/dist/components/CmsEmbeddedContent.d.ts +3 -0
- package/dist/components/CmsEmbeddedContent.d.ts.map +1 -1
- package/dist/components/CmsEmbeddedContent.js +3 -0
- package/dist/components/CmsEmbeddedContent.js.map +1 -1
- package/dist/components/CmsExternalComponent.d.ts +44 -0
- package/dist/components/CmsExternalComponent.d.ts.map +1 -1
- package/dist/components/CmsExternalComponent.js +7 -0
- package/dist/components/CmsExternalComponent.js.map +1 -1
- package/dist/components/ImageKitClientVideo.js +1 -0
- package/dist/components/ImageKitClientVideo.js.map +1 -1
- package/dist/components/SvgComponent.js +3 -1
- package/dist/components/SvgComponent.js.map +1 -1
- package/dist/components/VisualComponent.d.ts +47 -0
- package/dist/components/VisualComponent.d.ts.map +1 -1
- package/dist/components/VisualComponent.js +47 -0
- package/dist/components/VisualComponent.js.map +1 -1
- package/dist/elements/TrackedLink.d.ts +24 -0
- package/dist/elements/TrackedLink.d.ts.map +1 -0
- package/dist/elements/TrackedLink.js +76 -0
- package/dist/elements/TrackedLink.js.map +1 -0
- package/dist/framework/BackgroundMedia.js +5 -1
- package/dist/framework/BackgroundMedia.js.map +1 -1
- package/dist/framework/ComponentErrorIndicator.js +7 -4
- package/dist/framework/ComponentErrorIndicator.js.map +1 -1
- package/dist/framework/componentErrors.d.ts +8 -0
- package/dist/framework/componentErrors.d.ts.map +1 -1
- package/dist/framework/componentErrors.js +10 -0
- package/dist/framework/componentErrors.js.map +1 -1
- package/dist/hooks/useClickTracking.d.ts +39 -0
- package/dist/hooks/useClickTracking.d.ts.map +1 -1
- package/dist/hooks/useClickTracking.js +29 -0
- package/dist/hooks/useClickTracking.js.map +1 -1
- package/dist/index.d.ts +41 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -1
- package/dist/index.js.map +1 -1
- package/dist/rtf/rtf.d.ts +41 -0
- package/dist/rtf/rtf.d.ts.map +1 -1
- package/dist/rtf/rtf.js +36 -0
- package/dist/rtf/rtf.js.map +1 -1
- package/dist/utils/UnsupportedWarning.d.ts +23 -0
- package/dist/utils/UnsupportedWarning.d.ts.map +1 -1
- package/dist/utils/UnsupportedWarning.js +24 -0
- package/dist/utils/UnsupportedWarning.js.map +1 -1
- package/dist/utils/UnusedChecker.d.ts +39 -0
- package/dist/utils/UnusedChecker.d.ts.map +1 -1
- package/dist/utils/UnusedChecker.js +47 -3
- package/dist/utils/UnusedChecker.js.map +1 -1
- package/dist/utils/buildPageMetadata.d.ts +45 -0
- package/dist/utils/buildPageMetadata.d.ts.map +1 -1
- package/dist/utils/buildPageMetadata.js +37 -0
- package/dist/utils/buildPageMetadata.js.map +1 -1
- package/dist/utils/cn.d.ts +26 -0
- package/dist/utils/cn.d.ts.map +1 -1
- package/dist/utils/cn.js +26 -0
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/componentUtils.d.ts +121 -0
- package/dist/utils/componentUtils.d.ts.map +1 -1
- package/dist/utils/componentUtils.js +80 -0
- package/dist/utils/componentUtils.js.map +1 -1
- package/dist/utils/convertText.js +10 -2
- package/dist/utils/convertText.js.map +1 -1
- package/dist/utils/errorHandling.d.ts +27 -0
- package/dist/utils/errorHandling.d.ts.map +1 -1
- package/dist/utils/errorHandling.js +33 -0
- package/dist/utils/errorHandling.js.map +1 -1
- package/dist/utils/previewUtils.js +2 -0
- package/dist/utils/previewUtils.js.map +1 -1
- package/package.json +22 -8
- package/dist/elements/UtmLinkOrDiv.d.ts +0 -5
- package/dist/elements/UtmLinkOrDiv.d.ts.map +0 -1
- package/dist/elements/UtmLinkOrDiv.js +0 -9
- package/dist/elements/UtmLinkOrDiv.js.map +0 -1
package/README.md
CHANGED
|
@@ -87,6 +87,51 @@ In your Next.js app layout or root component:
|
|
|
87
87
|
import '@se-studio/core-ui/styles';
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
+
### Analytics Integration
|
|
91
|
+
|
|
92
|
+
Core UI ships analytics primitives but intentionally does not select a vendor.
|
|
93
|
+
Wrap your app with `AnalyticsProvider` and pass an adapter that implements the
|
|
94
|
+
`AnalyticsAdapter` interface.
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
import { AnalyticsProvider, ConsoleAnalyticsAdapter } from '@se-studio/core-ui';
|
|
98
|
+
|
|
99
|
+
const analyticsAdapter = new ConsoleAnalyticsAdapter(); // example adapter
|
|
100
|
+
|
|
101
|
+
export function AppProviders({ children }: { children: React.ReactNode }) {
|
|
102
|
+
return <AnalyticsProvider adapter={analyticsAdapter}>{children}</AnalyticsProvider>;
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Use the `useAnalytics` hook anywhere within the provider to trigger events:
|
|
107
|
+
|
|
108
|
+
```tsx
|
|
109
|
+
import { useAnalytics } from '@se-studio/core-ui';
|
|
110
|
+
|
|
111
|
+
export function NewsletterCta() {
|
|
112
|
+
const { trackClick } = useAnalytics();
|
|
113
|
+
|
|
114
|
+
return (
|
|
115
|
+
<button
|
|
116
|
+
type="button"
|
|
117
|
+
onClick={() =>
|
|
118
|
+
trackClick('Button', 'Sign up', {
|
|
119
|
+
page_title: 'Home',
|
|
120
|
+
page_type: 'landing',
|
|
121
|
+
slug: 'home',
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
>
|
|
125
|
+
Sign up
|
|
126
|
+
</button>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
The provided `ConsoleAnalyticsAdapter` simply logs events for development and
|
|
132
|
+
documentation purposes. Each project should supply an adapter that forwards
|
|
133
|
+
events to its analytics platform of choice.
|
|
134
|
+
|
|
90
135
|
## Components
|
|
91
136
|
|
|
92
137
|
### CMS Infrastructure Components
|
|
@@ -278,20 +323,39 @@ const previewConfig = mergeCmsRendererConfig(
|
|
|
278
323
|
);
|
|
279
324
|
```
|
|
280
325
|
|
|
281
|
-
## API
|
|
282
|
-
|
|
283
|
-
###
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
-
|
|
287
|
-
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
-
|
|
326
|
+
## API Reference
|
|
327
|
+
|
|
328
|
+
### Main Exports
|
|
329
|
+
|
|
330
|
+
#### Components
|
|
331
|
+
- **`CmsContent`** - Main component for rendering CMS content with automatic component mapping
|
|
332
|
+
- **`CmsComponent`** - Renders individual CMS components with type-based routing
|
|
333
|
+
- **`CmsCollection`** - Renders CMS collections (arrays of components)
|
|
334
|
+
- **`Visual`** - Optimized image/video/animation component with Next.js Image integration
|
|
335
|
+
- **`RTF`** - Renders Contentful rich text with support for embedded entries and assets
|
|
336
|
+
- **`UnusedChecker`** - Development utility to detect unused CMS content types
|
|
337
|
+
|
|
338
|
+
#### Hooks
|
|
339
|
+
- **`useAnalytics`** - Hook for accessing analytics functions (trackEvent, trackPage, trackClick)
|
|
340
|
+
- **`useClickTracking`** - Hook for tracking click events with analytics
|
|
341
|
+
- **`useDocumentVisible`** - Hook for tracking document visibility
|
|
342
|
+
|
|
343
|
+
#### Utilities
|
|
344
|
+
- **`buildPageMetadata`** - Generates Next.js metadata object from CMS page model
|
|
345
|
+
- **`handleCmsError`** - Error handling utility for CMS operations
|
|
346
|
+
- **`extractComponentInfo`** - Extract specific component information fields
|
|
347
|
+
- **`extractCollectionInfo`** - Extract specific collection information fields
|
|
348
|
+
- **`extractPageContext`** - Extract specific page context fields
|
|
349
|
+
- **`cn`** - Utility function for merging Tailwind CSS classes
|
|
350
|
+
|
|
351
|
+
#### Types
|
|
352
|
+
- **`CmsRendererConfig`** - Complete renderer configuration type
|
|
353
|
+
- **`ComponentRenderer<T>`** - Type for component renderer functions
|
|
354
|
+
- **`CollectionRenderer<T>`** - Type for collection renderer functions
|
|
355
|
+
- **`ComponentConfig<T>`** - Type-safe component configuration
|
|
356
|
+
- **`CollectionConfig<T>`** - Type-safe collection configuration
|
|
357
|
+
|
|
358
|
+
For detailed JSDoc documentation on all exports, see the TypeScript declaration files (`.d.ts`) in the package.
|
|
295
359
|
|
|
296
360
|
## Advanced Usage
|
|
297
361
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: Any is allowed */
|
|
1
2
|
import type { IContentContext } from '@se-studio/core-data-types';
|
|
2
3
|
import type { React } from 'next/dist/server/route-modules/app-page/vendored/rsc/entrypoints';
|
|
3
4
|
import type { CollectionMap, CollectionRenderer, EmbeddedCollectionMap } from './components/CmsCollection';
|
|
@@ -12,20 +13,141 @@ export type CmsRendererTypes = {
|
|
|
12
13
|
ExternaComponentNameType: string;
|
|
13
14
|
ExternalComponentType: any;
|
|
14
15
|
};
|
|
16
|
+
/**
|
|
17
|
+
* Configuration object that bundles all CMS renderer maps and display options.
|
|
18
|
+
* Create this once at the project level and pass it to CmsContent.
|
|
19
|
+
*
|
|
20
|
+
* This provides a clean, extensible API for configuring how CMS content is rendered,
|
|
21
|
+
* making it easy to add new renderer types without breaking existing code.
|
|
22
|
+
*
|
|
23
|
+
* @example Basic configuration
|
|
24
|
+
* ```tsx
|
|
25
|
+
* const rendererConfig = createCmsRendererConfig<MyProjectConfig>({
|
|
26
|
+
* componentMap: {
|
|
27
|
+
* "Hero": HeroComponent,
|
|
28
|
+
* "CTA": CTAComponent,
|
|
29
|
+
* "Content Block": ContentBlock,
|
|
30
|
+
* },
|
|
31
|
+
* collectionMap: {
|
|
32
|
+
* "FAQs": FAQCollection,
|
|
33
|
+
* "Related Articles": RelatedArticles,
|
|
34
|
+
* },
|
|
35
|
+
* showUnknownTypeErrors: process.env.NODE_ENV === 'development',
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example With all renderer types
|
|
40
|
+
* ```tsx
|
|
41
|
+
* const rendererConfig = createCmsRendererConfig<MyProjectConfig>({
|
|
42
|
+
* componentMap: { ... },
|
|
43
|
+
* collectionMap: { ... },
|
|
44
|
+
* externalComponentMap: {
|
|
45
|
+
* "Contact Form": ContactFormRenderer,
|
|
46
|
+
* "Newsletter": NewsletterRenderer,
|
|
47
|
+
* },
|
|
48
|
+
* visualComponentRenderer: VisualRenderer,
|
|
49
|
+
* internalLinkRenderer: InternalLinkRenderer,
|
|
50
|
+
* showUnknownTypeErrors: true,
|
|
51
|
+
* showRenderErrors: true,
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
15
55
|
export interface CmsRendererConfig<TConfig extends CmsRendererTypes = CmsRendererTypes> {
|
|
56
|
+
/**
|
|
57
|
+
* Map of component types to their renderers.
|
|
58
|
+
* Each key should match a ComponentType from your CMS configuration.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```tsx
|
|
62
|
+
* componentMap: {
|
|
63
|
+
* "Hero": HeroComponent,
|
|
64
|
+
* "CTA": CTAComponent,
|
|
65
|
+
* }
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
16
68
|
componentMap: ComponentMap<TConfig['ComponentNameType'], TConfig['ComponentType']>;
|
|
17
69
|
embeddedComponentMap: EmbeddedComponentMap<TConfig['ComponentNameType'], TConfig['ComponentType']>;
|
|
70
|
+
/**
|
|
71
|
+
* Map of collection types to their renderers.
|
|
72
|
+
* Each key should match a CollectionType from your CMS configuration.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```tsx
|
|
76
|
+
* collectionMap: {
|
|
77
|
+
* "FAQs": FAQCollection,
|
|
78
|
+
* "Related Articles": RelatedArticles,
|
|
79
|
+
* }
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
18
82
|
collectionMap: CollectionMap<TConfig['CollectionNameType'], TConfig['CollectionType']>;
|
|
19
83
|
embeddedCollectionMap: EmbeddedCollectionMap<TConfig['CollectionNameType'], TConfig['CollectionType']>;
|
|
84
|
+
/**
|
|
85
|
+
* Map of external component types to their renderers (optional).
|
|
86
|
+
* Use this for third-party integrations, forms, widgets, etc.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```tsx
|
|
90
|
+
* externalComponentMap: {
|
|
91
|
+
* "Contact Form": ContactFormRenderer,
|
|
92
|
+
* "Newsletter": NewsletterRenderer,
|
|
93
|
+
* }
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
20
96
|
externalComponentMap: ExternalComponentMap<TConfig['ExternaComponentNameType'], TConfig['ExternalComponentType']>;
|
|
21
97
|
embeddedExternalComponentMap: EmbeddedExternalComponentMap<TConfig['ExternaComponentNameType'], TConfig['ExternalComponentType']>;
|
|
98
|
+
/**
|
|
99
|
+
* Renderer for Visual content types (optional).
|
|
100
|
+
* Use this to define how images, videos, and other visual assets are rendered.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```tsx
|
|
104
|
+
* visualComponentRenderer: ({ information, contentContext }) => (
|
|
105
|
+
* <VisualComponent visual={information} />
|
|
106
|
+
* )
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
22
109
|
visualComponentRenderer: VisualComponentRenderer;
|
|
110
|
+
/**
|
|
111
|
+
* Renderer for Internal Link content types (optional).
|
|
112
|
+
* Use this to define how internal navigation links are rendered.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```tsx
|
|
116
|
+
* internalLinkRenderer: ({ information }) => (
|
|
117
|
+
* <Link href={information.href}>{information.text}</Link>
|
|
118
|
+
* )
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
23
121
|
internalLinkRenderer: InternalLinkRenderer;
|
|
122
|
+
/**
|
|
123
|
+
* Map of custom content types to their renderers (optional).
|
|
124
|
+
* Use this for project-specific content types that extend the base CMS content model.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```tsx
|
|
128
|
+
* customContentMap: {
|
|
129
|
+
* "pricingPlan": PricingPlanRenderer,
|
|
130
|
+
* "testimonial": TestimonialRenderer,
|
|
131
|
+
* }
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
24
134
|
customContentMap?: Partial<Record<string, React.FC<{
|
|
25
135
|
information: any;
|
|
26
136
|
contentContext: IContentContext;
|
|
27
137
|
}>>>;
|
|
138
|
+
/**
|
|
139
|
+
* Show error panels for unknown content types in development mode (default: false).
|
|
140
|
+
* When true, displays a visual warning when a component/collection type is not mapped.
|
|
141
|
+
*
|
|
142
|
+
* Recommended: Set to `process.env.NODE_ENV === 'development'`
|
|
143
|
+
*/
|
|
28
144
|
showUnknownTypeErrors: boolean;
|
|
145
|
+
/**
|
|
146
|
+
* Show error panels for rendering errors (default: false).
|
|
147
|
+
* When true, displays error details when a component throws during rendering.
|
|
148
|
+
*
|
|
149
|
+
* Recommended: Set to `process.env.NODE_ENV === 'development'`
|
|
150
|
+
*/
|
|
29
151
|
showRenderErrors: boolean;
|
|
30
152
|
defaultComponentRenderer: ComponentRenderer<any>;
|
|
31
153
|
defaultCollectionRenderer: CollectionRenderer<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CmsRendererConfig.d.ts","sourceRoot":"","sources":["../src/CmsRendererConfig.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CmsRendererConfig.d.ts","sourceRoot":"","sources":["../src/CmsRendererConfig.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kEAAkE,CAAC;AAC9F,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,KAAK,EACV,4BAA4B,EAC5B,oBAAoB,EACrB,MAAM,mCAAmC,CAAC;AAE3C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,GAAG,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,GAAG,CAAC;IACpB,wBAAwB,EAAE,MAAM,CAAC;IACjC,qBAAqB,EAAE,GAAG,CAAC;CAC5B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,WAAW,iBAAiB,CAAC,OAAO,SAAS,gBAAgB,GAAG,gBAAgB;IACpF;;;;;;;;;;;OAWG;IACH,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAEnF,oBAAoB,EAAE,oBAAoB,CACxC,OAAO,CAAC,mBAAmB,CAAC,EAC5B,OAAO,CAAC,eAAe,CAAC,CACzB,CAAC;IAEF;;;;;;;;;;;OAWG;IACH,aAAa,EAAE,aAAa,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACvF,qBAAqB,EAAE,qBAAqB,CAC1C,OAAO,CAAC,oBAAoB,CAAC,EAC7B,OAAO,CAAC,gBAAgB,CAAC,CAC1B,CAAC;IAEF;;;;;;;;;;;OAWG;IACH,oBAAoB,EAAE,oBAAoB,CACxC,OAAO,CAAC,0BAA0B,CAAC,EACnC,OAAO,CAAC,uBAAuB,CAAC,CACjC,CAAC;IACF,4BAA4B,EAAE,4BAA4B,CACxD,OAAO,CAAC,0BAA0B,CAAC,EACnC,OAAO,CAAC,uBAAuB,CAAC,CACjC,CAAC;IAEF;;;;;;;;;;OAUG;IACH,uBAAuB,EAAE,uBAAuB,CAAC;IAEjD;;;;;;;;;;OAUG;IACH,oBAAoB,EAAE,oBAAoB,CAAC;IAE3C;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,EAAE,OAAO,CACxB,MAAM,CACJ,MAAM,EACN,KAAK,CAAC,EAAE,CAAC;QACP,WAAW,EAAE,GAAG,CAAC;QACjB,cAAc,EAAE,eAAe,CAAC;KACjC,CAAC,CACH,CACF,CAAC;IAEF;;;;;OAKG;IACH,qBAAqB,EAAE,OAAO,CAAC;IAE/B;;;;;OAKG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAE1B,wBAAwB,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACjD,yBAAyB,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC;CACpD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import type { AnalyticsAdapter } from './types';
|
|
3
|
+
export interface AnalyticsProviderProps {
|
|
4
|
+
adapter: AnalyticsAdapter;
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Provider component that makes analytics adapter available to child components
|
|
9
|
+
*/
|
|
10
|
+
export declare function AnalyticsProvider({ adapter, children }: AnalyticsProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
/**
|
|
12
|
+
* Hook to access the analytics adapter from context
|
|
13
|
+
* @throws Error if used outside of AnalyticsProvider
|
|
14
|
+
*/
|
|
15
|
+
export declare function useAnalyticsContext(): AnalyticsAdapter;
|
|
16
|
+
//# sourceMappingURL=AnalyticsProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsProvider.d.ts","sourceRoot":"","sources":["../../src/analytics/AnalyticsProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIhD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,sBAAsB,2CAE9E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAMtD"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, useContext } from 'react';
|
|
4
|
+
const AnalyticsContext = createContext(null);
|
|
5
|
+
/**
|
|
6
|
+
* Provider component that makes analytics adapter available to child components
|
|
7
|
+
*/
|
|
8
|
+
export function AnalyticsProvider({ adapter, children }) {
|
|
9
|
+
return _jsx(AnalyticsContext.Provider, { value: adapter, children: children });
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Hook to access the analytics adapter from context
|
|
13
|
+
* @throws Error if used outside of AnalyticsProvider
|
|
14
|
+
*/
|
|
15
|
+
export function useAnalyticsContext() {
|
|
16
|
+
const adapter = useContext(AnalyticsContext);
|
|
17
|
+
if (!adapter) {
|
|
18
|
+
throw new Error('useAnalyticsContext must be used within an AnalyticsProvider');
|
|
19
|
+
}
|
|
20
|
+
return adapter;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=AnalyticsProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalyticsProvider.js","sourceRoot":"","sources":["../../src/analytics/AnalyticsProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGlD,MAAM,gBAAgB,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAOtE;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAA0B;IAC7E,OAAO,KAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,OAAO,YAAG,QAAQ,GAA6B,CAAC;AAC3F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AnalyticsAdapter, ClickTrackingProperties, PageTrackingProperties } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Console adapter used as the default/example implementation.
|
|
4
|
+
* Customer projects should provide their own adapter that satisfies `AnalyticsAdapter`.
|
|
5
|
+
*/
|
|
6
|
+
export declare class ConsoleAnalyticsAdapter implements AnalyticsAdapter {
|
|
7
|
+
private log;
|
|
8
|
+
trackEvent(event: string, properties: Record<string, unknown>): void;
|
|
9
|
+
trackPage(url: string, properties: PageTrackingProperties): void;
|
|
10
|
+
trackClick(properties: ClickTrackingProperties): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=ConsoleAnalyticsAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsoleAnalyticsAdapter.d.ts","sourceRoot":"","sources":["../../../src/analytics/adapters/ConsoleAnalyticsAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAElG;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,gBAAgB;IAC9D,OAAO,CAAC,GAAG;IAKX,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIpE,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,GAAG,IAAI;IAIhE,UAAU,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI;CAGtD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* Console adapter used as the default/example implementation.
|
|
4
|
+
* Customer projects should provide their own adapter that satisfies `AnalyticsAdapter`.
|
|
5
|
+
*/
|
|
6
|
+
export class ConsoleAnalyticsAdapter {
|
|
7
|
+
log(...args) {
|
|
8
|
+
// eslint-disable-next-line no-console -- intentional logging adapter
|
|
9
|
+
console.log('[Analytics]', ...args);
|
|
10
|
+
}
|
|
11
|
+
trackEvent(event, properties) {
|
|
12
|
+
this.log('event', event, properties);
|
|
13
|
+
}
|
|
14
|
+
trackPage(url, properties) {
|
|
15
|
+
this.log('page', { ...properties, url });
|
|
16
|
+
}
|
|
17
|
+
trackClick(properties) {
|
|
18
|
+
this.log('click', properties);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ConsoleAnalyticsAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConsoleAnalyticsAdapter.js","sourceRoot":"","sources":["../../../src/analytics/adapters/ConsoleAnalyticsAdapter.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAIb;;;GAGG;AACH,MAAM,OAAO,uBAAuB;IAC1B,GAAG,CAAC,GAAG,IAAe;QAC5B,qEAAqE;QACrE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,UAAU,CAAC,KAAa,EAAE,UAAmC;QAC3D,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,UAAkC;QACvD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,UAAU,CAAC,UAAmC;QAC5C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analytics/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analytics/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { IAnalyticsContext } from '@se-studio/core-data-types';
|
|
2
|
+
/**
|
|
3
|
+
* Properties for tracking a click event
|
|
4
|
+
*/
|
|
5
|
+
export interface ClickTrackingProperties extends IAnalyticsContext {
|
|
6
|
+
componentType: string;
|
|
7
|
+
url: string;
|
|
8
|
+
targetUrl?: string;
|
|
9
|
+
linkText: string;
|
|
10
|
+
location?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Properties for tracking a page view
|
|
14
|
+
*/
|
|
15
|
+
export interface PageTrackingProperties extends IAnalyticsContext {
|
|
16
|
+
url: string;
|
|
17
|
+
pathname: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Interface that analytics adapters must implement
|
|
21
|
+
*/
|
|
22
|
+
export interface AnalyticsAdapter {
|
|
23
|
+
/**
|
|
24
|
+
* Track a custom event
|
|
25
|
+
* @param event - Event name
|
|
26
|
+
* @param properties - Event properties
|
|
27
|
+
*/
|
|
28
|
+
trackEvent(event: string, properties: Record<string, unknown>): void;
|
|
29
|
+
/**
|
|
30
|
+
* Track a page view
|
|
31
|
+
* @param url - Full URL of the page
|
|
32
|
+
* @param properties - Page properties
|
|
33
|
+
*/
|
|
34
|
+
trackPage(url: string, properties: PageTrackingProperties): void;
|
|
35
|
+
/**
|
|
36
|
+
* Track a component click
|
|
37
|
+
* @param properties - Click tracking properties
|
|
38
|
+
*/
|
|
39
|
+
trackClick(properties: ClickTrackingProperties): void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/analytics/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAErE;;;;OAIG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAAC;IAEjE;;;OAGG;IACH,UAAU,CAAC,UAAU,EAAE,uBAAuB,GAAG,IAAI,CAAC;CACvD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analytics/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { IAnalyticsContext } from '@se-studio/core-data-types';
|
|
2
|
+
/**
|
|
3
|
+
* Hook for accessing analytics functions.
|
|
4
|
+
*
|
|
5
|
+
* Provides a clean API for tracking events, pages, and clicks. Must be used
|
|
6
|
+
* within an AnalyticsProvider context.
|
|
7
|
+
*
|
|
8
|
+
* @returns Object with tracking functions:
|
|
9
|
+
* - `trackEvent` - Track custom events
|
|
10
|
+
* - `trackPage` - Track page views
|
|
11
|
+
* - `trackClick` - Track click interactions
|
|
12
|
+
*
|
|
13
|
+
* @throws {Error} If used outside of AnalyticsProvider
|
|
14
|
+
*
|
|
15
|
+
* @example Basic usage
|
|
16
|
+
* ```tsx
|
|
17
|
+
* import { useAnalytics } from '@se-studio/core-ui';
|
|
18
|
+
*
|
|
19
|
+
* function MyComponent() {
|
|
20
|
+
* const { trackClick, trackPage } = useAnalytics();
|
|
21
|
+
*
|
|
22
|
+
* useEffect(() => {
|
|
23
|
+
* trackPage(window.location.href, window.location.pathname, {
|
|
24
|
+
* page_title: 'Home',
|
|
25
|
+
* page_type: 'landing',
|
|
26
|
+
* });
|
|
27
|
+
* }, []);
|
|
28
|
+
*
|
|
29
|
+
* return (
|
|
30
|
+
* <button onClick={() => trackClick('Button', 'Sign up', { page_title: 'Home' })}>
|
|
31
|
+
* Sign up
|
|
32
|
+
* </button>
|
|
33
|
+
* );
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function useAnalytics(): {
|
|
38
|
+
trackEvent: (event: string, properties: Record<string, unknown>) => void;
|
|
39
|
+
trackPage: (url: string, pathname: string, analyticsContext: IAnalyticsContext) => void;
|
|
40
|
+
trackClick: (componentType: string, linkText: string, analyticsContext: IAnalyticsContext, options?: {
|
|
41
|
+
targetUrl?: string;
|
|
42
|
+
location?: string;
|
|
43
|
+
}) => void;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=useAnalytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAnalytics.d.ts","sourceRoot":"","sources":["../../src/analytics/useAnalytics.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAKpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,YAAY;wBAIhB,MAAM,cAAc,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;qBAO7C,MAAM,YAAY,MAAM,oBAAoB,iBAAiB;gCAalD,MAAM,YACX,MAAM,oBACE,iBAAiB,YACzB;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;EAqBN"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import { useAnalyticsContext } from './AnalyticsProvider';
|
|
4
|
+
/**
|
|
5
|
+
* Hook for accessing analytics functions.
|
|
6
|
+
*
|
|
7
|
+
* Provides a clean API for tracking events, pages, and clicks. Must be used
|
|
8
|
+
* within an AnalyticsProvider context.
|
|
9
|
+
*
|
|
10
|
+
* @returns Object with tracking functions:
|
|
11
|
+
* - `trackEvent` - Track custom events
|
|
12
|
+
* - `trackPage` - Track page views
|
|
13
|
+
* - `trackClick` - Track click interactions
|
|
14
|
+
*
|
|
15
|
+
* @throws {Error} If used outside of AnalyticsProvider
|
|
16
|
+
*
|
|
17
|
+
* @example Basic usage
|
|
18
|
+
* ```tsx
|
|
19
|
+
* import { useAnalytics } from '@se-studio/core-ui';
|
|
20
|
+
*
|
|
21
|
+
* function MyComponent() {
|
|
22
|
+
* const { trackClick, trackPage } = useAnalytics();
|
|
23
|
+
*
|
|
24
|
+
* useEffect(() => {
|
|
25
|
+
* trackPage(window.location.href, window.location.pathname, {
|
|
26
|
+
* page_title: 'Home',
|
|
27
|
+
* page_type: 'landing',
|
|
28
|
+
* });
|
|
29
|
+
* }, []);
|
|
30
|
+
*
|
|
31
|
+
* return (
|
|
32
|
+
* <button onClick={() => trackClick('Button', 'Sign up', { page_title: 'Home' })}>
|
|
33
|
+
* Sign up
|
|
34
|
+
* </button>
|
|
35
|
+
* );
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export function useAnalytics() {
|
|
40
|
+
const adapter = useAnalyticsContext();
|
|
41
|
+
const trackEvent = useCallback((event, properties) => {
|
|
42
|
+
adapter.trackEvent(event, properties);
|
|
43
|
+
}, [adapter]);
|
|
44
|
+
const trackPage = useCallback((url, pathname, analyticsContext) => {
|
|
45
|
+
const properties = {
|
|
46
|
+
url,
|
|
47
|
+
pathname,
|
|
48
|
+
...analyticsContext,
|
|
49
|
+
};
|
|
50
|
+
adapter.trackPage(url, properties);
|
|
51
|
+
}, [adapter]);
|
|
52
|
+
const trackClick = useCallback((componentType, linkText, analyticsContext, options) => {
|
|
53
|
+
const url = typeof window !== 'undefined' ? window.location.href : '';
|
|
54
|
+
const properties = {
|
|
55
|
+
componentType,
|
|
56
|
+
url,
|
|
57
|
+
linkText,
|
|
58
|
+
location: options?.location,
|
|
59
|
+
targetUrl: options?.targetUrl,
|
|
60
|
+
...analyticsContext,
|
|
61
|
+
};
|
|
62
|
+
adapter.trackClick(properties);
|
|
63
|
+
}, [adapter]);
|
|
64
|
+
return {
|
|
65
|
+
trackEvent,
|
|
66
|
+
trackPage,
|
|
67
|
+
trackClick,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=useAnalytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAnalytics.js","sourceRoot":"","sources":["../../src/analytics/useAnalytics.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IAEtC,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,KAAa,EAAE,UAAmC,EAAE,EAAE;QACrD,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,GAAW,EAAE,QAAgB,EAAE,gBAAmC,EAAE,EAAE;QACrE,MAAM,UAAU,GAA2B;YACzC,GAAG;YACH,QAAQ;YACR,GAAG,gBAAgB;SACpB,CAAC;QACF,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,MAAM,UAAU,GAAG,WAAW,CAC5B,CACE,aAAqB,EACrB,QAAgB,EAChB,gBAAmC,EACnC,OAGC,EACD,EAAE;QACF,MAAM,GAAG,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,MAAM,UAAU,GAA4B;YAC1C,aAAa;YACb,GAAG;YACH,QAAQ;YACR,QAAQ,EAAE,OAAO,EAAE,QAAQ;YAC3B,SAAS,EAAE,OAAO,EAAE,SAAS;YAC7B,GAAG,gBAAgB;SACpB,CAAC;QACF,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACjC,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,OAAO;QACL,UAAU;QACV,SAAS;QACT,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClientMonitor.d.ts","sourceRoot":"","sources":["../../src/components/ClientMonitor.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ClientMonitor.d.ts","sourceRoot":"","sources":["../../src/components/ClientMonitor.tsx"],"names":[],"mappings":"AAkbA,UAAU,kBAAkB;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAuBtD,CAAC"}
|