@se-studio/core-ui 1.14.7 → 1.14.8
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/CHANGELOG.md +6 -0
- package/dist/analytics/AnalyticsProvider.d.ts +6 -5
- package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
- package/dist/analytics/AnalyticsProvider.js +25 -11
- package/dist/analytics/AnalyticsProvider.js.map +1 -1
- package/dist/analytics/useAnalytics.d.ts +2 -4
- package/dist/analytics/useAnalytics.d.ts.map +1 -1
- package/dist/analytics/useAnalytics.js +2 -4
- package/dist/analytics/useAnalytics.js.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @se-studio/core-ui
|
|
2
2
|
|
|
3
|
+
## 1.14.8
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Share a singleton Analytics React context across duplicate package instances and fall back to a no-op adapter instead of throwing, so client hydration no longer white-screens when core-ui is bundled more than once.
|
|
8
|
+
|
|
3
9
|
## 1.14.7
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
2
|
import type { AnalyticsAdapter } from './types';
|
|
3
3
|
interface AnalyticsProviderProps {
|
|
4
4
|
adapter: AnalyticsAdapter;
|
|
5
|
-
children:
|
|
5
|
+
children: ReactNode;
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
8
|
* Provider component that makes analytics adapter available to child components
|
|
9
9
|
*/
|
|
10
|
-
export declare function AnalyticsProvider({ adapter, children }: AnalyticsProviderProps):
|
|
10
|
+
export declare function AnalyticsProvider({ adapter, children }: AnalyticsProviderProps): import("react").JSX.Element;
|
|
11
11
|
/**
|
|
12
|
-
* Hook to access the analytics adapter from context
|
|
13
|
-
*
|
|
12
|
+
* Hook to access the analytics adapter from context.
|
|
13
|
+
* Returns a no-op adapter when no provider is present so client components never crash
|
|
14
|
+
* the React tree (SSR prerender and defensive client fallback).
|
|
14
15
|
*/
|
|
15
16
|
export declare function useAnalyticsContext(): AnalyticsAdapter;
|
|
16
17
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsProvider.d.ts","sourceRoot":"","sources":["../../src/analytics/AnalyticsProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"AnalyticsProvider.d.ts","sourceRoot":"","sources":["../../src/analytics/AnalyticsProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAW,SAAS,EAAE,MAAM,OAAO,CAAC;AAEhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAgChD,UAAU,sBAAsB;IAC9B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,sBAAsB,+BAE9E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAYtD"}
|
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { createContext, useContext } from 'react';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
/** Stable global key so duplicate package instances share one React context identity. */
|
|
5
|
+
const GLOBAL_CONTEXT_KEY = '__SE_STUDIO_ANALYTICS_CONTEXT__';
|
|
6
|
+
/**
|
|
7
|
+
* Share one React context identity even when `@se-studio/core-ui` is duplicated in the
|
|
8
|
+
* client bundle (pnpm peer isolation / multi-chunk). Separate module evaluations that each
|
|
9
|
+
* call `createContext()` would otherwise break the provider tree and crash the site with
|
|
10
|
+
* "useAnalyticsContext must be used within an AnalyticsProvider".
|
|
11
|
+
*/
|
|
12
|
+
function getAnalyticsContext() {
|
|
13
|
+
const globalStore = globalThis;
|
|
14
|
+
if (!globalStore[GLOBAL_CONTEXT_KEY]) {
|
|
15
|
+
globalStore[GLOBAL_CONTEXT_KEY] = createContext(null);
|
|
16
|
+
}
|
|
17
|
+
return globalStore[GLOBAL_CONTEXT_KEY];
|
|
18
|
+
}
|
|
19
|
+
const AnalyticsContext = getAnalyticsContext();
|
|
20
|
+
/** Silent no-op when provider is missing (SSR prerender, or no layout provider). */
|
|
21
|
+
const NOOP_ANALYTICS_FALLBACK = {
|
|
7
22
|
trackEvent() { },
|
|
8
23
|
trackPage() { },
|
|
9
24
|
trackClick() { },
|
|
@@ -15,20 +30,19 @@ export function AnalyticsProvider({ adapter, children }) {
|
|
|
15
30
|
return _jsx(AnalyticsContext.Provider, { value: adapter, children: children });
|
|
16
31
|
}
|
|
17
32
|
/**
|
|
18
|
-
* Hook to access the analytics adapter from context
|
|
19
|
-
*
|
|
33
|
+
* Hook to access the analytics adapter from context.
|
|
34
|
+
* Returns a no-op adapter when no provider is present so client components never crash
|
|
35
|
+
* the React tree (SSR prerender and defensive client fallback).
|
|
20
36
|
*/
|
|
21
37
|
export function useAnalyticsContext() {
|
|
22
38
|
const adapter = useContext(AnalyticsContext);
|
|
23
39
|
if (adapter) {
|
|
24
40
|
return adapter;
|
|
25
41
|
}
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (typeof window === 'undefined') {
|
|
30
|
-
return SSR_ANALYTICS_FALLBACK;
|
|
42
|
+
// Dev-only signal that tracking is a no-op (missing layout provider or mis-wiring).
|
|
43
|
+
if (process.env.NODE_ENV !== 'production' && typeof window !== 'undefined') {
|
|
44
|
+
console.warn('[analytics] useAnalyticsContext used without AnalyticsProvider; tracking is a no-op.');
|
|
31
45
|
}
|
|
32
|
-
|
|
46
|
+
return NOOP_ANALYTICS_FALLBACK;
|
|
33
47
|
}
|
|
34
48
|
//# sourceMappingURL=AnalyticsProvider.js.map
|
|
@@ -1 +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,
|
|
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,yFAAyF;AACzF,MAAM,kBAAkB,GAAG,iCAAiC,CAAC;AAM7D;;;;;GAKG;AACH,SAAS,mBAAmB;IAC1B,MAAM,WAAW,GAAG,UAAwC,CAAC;IAC7D,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACrC,WAAW,CAAC,kBAAkB,CAAC,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,WAAW,CAAC,kBAAkB,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;AAE/C,oFAAoF;AACpF,MAAM,uBAAuB,GAAqB;IAChD,UAAU,KAAI,CAAC;IACf,SAAS,KAAI,CAAC;IACd,UAAU,KAAI,CAAC;CAChB,CAAC;AAOF;;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;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,oFAAoF;IACpF,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3E,OAAO,CAAC,IAAI,CACV,sFAAsF,CACvF,CAAC;IACJ,CAAC;IACD,OAAO,uBAAuB,CAAC;AACjC,CAAC"}
|
|
@@ -2,16 +2,14 @@ import type { IAnalyticsContext, ILinkTrackingInfo } from '@se-studio/core-data-
|
|
|
2
2
|
/**
|
|
3
3
|
* Hook for accessing analytics functions.
|
|
4
4
|
*
|
|
5
|
-
* Provides a clean API for tracking events, pages, and clicks.
|
|
6
|
-
*
|
|
5
|
+
* Provides a clean API for tracking events, pages, and clicks. Prefer using
|
|
6
|
+
* inside an `AnalyticsProvider`; without one, calls are silent no-ops.
|
|
7
7
|
*
|
|
8
8
|
* @returns Object with tracking functions:
|
|
9
9
|
* - `trackEvent` - Track custom events
|
|
10
10
|
* - `trackPage` - Track page views
|
|
11
11
|
* - `trackClick` - Track click interactions
|
|
12
12
|
*
|
|
13
|
-
* @throws {Error} If used outside of AnalyticsProvider
|
|
14
|
-
*
|
|
15
13
|
* @example Basic usage
|
|
16
14
|
* ```tsx
|
|
17
15
|
* import { useAnalytics } from '@se-studio/core-ui';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAnalytics.d.ts","sourceRoot":"","sources":["../../src/analytics/useAnalytics.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAKvF
|
|
1
|
+
{"version":3,"file":"useAnalytics.d.ts","sourceRoot":"","sources":["../../src/analytics/useAnalytics.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAKvF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,YAAY;wBAGhB,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;QAClB,YAAY,CAAC,EAAE,iBAAiB,CAAC;KAClC;EAsBN"}
|
|
@@ -4,16 +4,14 @@ import { useAnalyticsContext } from './AnalyticsProvider';
|
|
|
4
4
|
/**
|
|
5
5
|
* Hook for accessing analytics functions.
|
|
6
6
|
*
|
|
7
|
-
* Provides a clean API for tracking events, pages, and clicks.
|
|
8
|
-
*
|
|
7
|
+
* Provides a clean API for tracking events, pages, and clicks. Prefer using
|
|
8
|
+
* inside an `AnalyticsProvider`; without one, calls are silent no-ops.
|
|
9
9
|
*
|
|
10
10
|
* @returns Object with tracking functions:
|
|
11
11
|
* - `trackEvent` - Track custom events
|
|
12
12
|
* - `trackPage` - Track page views
|
|
13
13
|
* - `trackClick` - Track click interactions
|
|
14
14
|
*
|
|
15
|
-
* @throws {Error} If used outside of AnalyticsProvider
|
|
16
|
-
*
|
|
17
15
|
* @example Basic usage
|
|
18
16
|
* ```tsx
|
|
19
17
|
* import { useAnalytics } from '@se-studio/core-ui';
|
|
@@ -1 +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
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC;IACtC,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,OAIC,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,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@se-studio/core-ui",
|
|
3
|
-
"version": "1.14.
|
|
3
|
+
"version": "1.14.8",
|
|
4
4
|
"description": "Shared React UI component library with Tailwind CSS v4 for SE Studio applications",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
}
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@contentful/live-preview": "^4.10.
|
|
67
|
+
"@contentful/live-preview": "^4.10.12",
|
|
68
68
|
"@contentful/rich-text-react-renderer": "^16.2.1",
|
|
69
69
|
"@contentful/rich-text-types": "^17.2.7",
|
|
70
70
|
"@radix-ui/react-slot": "^1.3.0",
|
|
@@ -79,14 +79,14 @@
|
|
|
79
79
|
"@se-studio/core-data-types": "1.6.1"
|
|
80
80
|
},
|
|
81
81
|
"devDependencies": {
|
|
82
|
-
"@biomejs/biome": "^2.5.
|
|
83
|
-
"@types/node": "^24.13.
|
|
82
|
+
"@biomejs/biome": "^2.5.5",
|
|
83
|
+
"@types/node": "^24.13.3",
|
|
84
84
|
"@types/react": "^19.2.17",
|
|
85
85
|
"@types/react-dom": "^19.2.3",
|
|
86
86
|
"jsdom": "^29.1.1",
|
|
87
|
-
"next": "^15.5.
|
|
87
|
+
"next": "^15.5.21",
|
|
88
88
|
"typescript": "^6.0.3",
|
|
89
|
-
"vitest": "^4.1.
|
|
89
|
+
"vitest": "^4.1.10"
|
|
90
90
|
},
|
|
91
91
|
"scripts": {
|
|
92
92
|
"build": "tsc --project tsconfig.build.json",
|