@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 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 React from 'react';
1
+ import type { ReactNode } from 'react';
2
2
  import type { AnalyticsAdapter } from './types';
3
3
  interface AnalyticsProviderProps {
4
4
  adapter: AnalyticsAdapter;
5
- children: React.ReactNode;
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): React.JSX.Element;
10
+ export declare function AnalyticsProvider({ adapter, children }: AnalyticsProviderProps): import("react").JSX.Element;
11
11
  /**
12
- * Hook to access the analytics adapter from context
13
- * @throws Error if used outside of AnalyticsProvider
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,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAWhD,UAAU,sBAAsB;IAC9B,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,qBAE9E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAYtD"}
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
- const AnalyticsContext = createContext(null);
5
- /** Silent adapter for SSR when provider context is not in the same bundle (e.g. static / prerender). */
6
- const SSR_ANALYTICS_FALLBACK = {
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
- * @throws Error if used outside of AnalyticsProvider
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
- // App Router can prerender client components (e.g. TrackedLink on /) in a server
27
- // chunk separate from the layout AnalyticsProvider client bundle. Avoid failing the build;
28
- // the hydrated client render uses the real provider.
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
- throw new Error('useAnalyticsContext must be used within an AnalyticsProvider');
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,gBAAgB,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAEtE,wGAAwG;AACxG,MAAM,sBAAsB,GAAqB;IAC/C,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;;;GAGG;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,iFAAiF;IACjF,2FAA2F;IAC3F,qDAAqD;IACrD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,sBAAsB,CAAC;IAChC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;AAClF,CAAC"}
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. Must be used
6
- * within an AnalyticsProvider context.
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;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"}
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. Must be used
8
- * within an AnalyticsProvider context.
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;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"}
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.7",
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.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.2",
83
- "@types/node": "^24.13.2",
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.20",
87
+ "next": "^15.5.21",
88
88
  "typescript": "^6.0.3",
89
- "vitest": "^4.1.9"
89
+ "vitest": "^4.1.10"
90
90
  },
91
91
  "scripts": {
92
92
  "build": "tsc --project tsconfig.build.json",