@carlonicora/nextjs-jsonapi 6.19.0 → 6.20.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.
Files changed (91) hide show
  1. package/dist/{BlockNoteEditor-5HSL74IX.mjs → BlockNoteEditor-7JRJ3XWV.mjs} +5 -5
  2. package/dist/{BlockNoteEditor-6RZXGMSD.js → BlockNoteEditor-MH2D5L4A.js} +20 -20
  3. package/dist/{BlockNoteEditor-6RZXGMSD.js.map → BlockNoteEditor-MH2D5L4A.js.map} +1 -1
  4. package/dist/{BlockNoteViewer-XYKFY77F.js → BlockNoteViewer-72J3CBAH.js} +4 -4
  5. package/dist/{BlockNoteViewer-XYKFY77F.js.map → BlockNoteViewer-72J3CBAH.js.map} +1 -1
  6. package/dist/{BlockNoteViewer-X4UEVI2A.mjs → BlockNoteViewer-UKYEU3E3.mjs} +3 -3
  7. package/dist/{analytics.modules-Bsacu6ik.d.ts → analytics.modules-C4OT7fVa.d.ts} +1 -0
  8. package/dist/{analytics.modules-txdCLNG-.d.mts → analytics.modules-DEnXnRGt.d.mts} +1 -0
  9. package/dist/billing/index.js +492 -492
  10. package/dist/billing/index.mjs +4 -4
  11. package/dist/{chunk-OKBJEIOP.mjs → chunk-2U57XVNF.mjs} +1 -1
  12. package/dist/chunk-2U57XVNF.mjs.map +1 -0
  13. package/dist/{chunk-KMPBSOFB.mjs → chunk-ASORDSWQ.mjs} +50 -2
  14. package/dist/chunk-ASORDSWQ.mjs.map +1 -0
  15. package/dist/{chunk-B4ZH2FOC.js → chunk-IN2F6HI2.js} +906 -906
  16. package/dist/{chunk-B4ZH2FOC.js.map → chunk-IN2F6HI2.js.map} +1 -1
  17. package/dist/{chunk-DFA566KY.js → chunk-JAOBCIE7.js} +4 -4
  18. package/dist/{chunk-DFA566KY.js.map → chunk-JAOBCIE7.js.map} +1 -1
  19. package/dist/{chunk-YVKWACDP.mjs → chunk-LSZZIQJ5.mjs} +2 -2
  20. package/dist/{chunk-I5BQLY7V.js → chunk-MVAIYPIN.js} +9 -9
  21. package/dist/{chunk-I5BQLY7V.js.map → chunk-MVAIYPIN.js.map} +1 -1
  22. package/dist/{chunk-HEDHJAKT.mjs → chunk-NKXNOGMH.mjs} +6 -6
  23. package/dist/{chunk-OO2DBP6L.js → chunk-SGLFQ55U.js} +942 -894
  24. package/dist/chunk-SGLFQ55U.js.map +1 -0
  25. package/dist/{chunk-TY5YWBLL.mjs → chunk-SJ3K3ATF.mjs} +3 -3
  26. package/dist/{chunk-A7Y5YW7Q.js → chunk-V7CHD7QT.js} +1 -1
  27. package/dist/{chunk-A7Y5YW7Q.js.map → chunk-V7CHD7QT.js.map} +1 -1
  28. package/dist/client/index.js +5 -5
  29. package/dist/client/index.mjs +4 -4
  30. package/dist/components/index.js +5 -5
  31. package/dist/components/index.mjs +4 -4
  32. package/dist/contexts/index.js +5 -5
  33. package/dist/contexts/index.mjs +4 -4
  34. package/dist/core/index.d.mts +2 -1
  35. package/dist/core/index.d.ts +2 -1
  36. package/dist/core/index.js +3 -3
  37. package/dist/core/index.mjs +2 -2
  38. package/dist/email-automations/index.js +118 -118
  39. package/dist/email-automations/index.mjs +4 -4
  40. package/dist/features/analytics/index.d.mts +60 -3
  41. package/dist/features/analytics/index.d.ts +60 -3
  42. package/dist/features/analytics/index.js +320 -128
  43. package/dist/features/analytics/index.js.map +1 -1
  44. package/dist/features/analytics/index.mjs +314 -122
  45. package/dist/features/analytics/index.mjs.map +1 -1
  46. package/dist/features/analytics/server.js +5 -5
  47. package/dist/features/analytics/server.mjs +3 -3
  48. package/dist/features/blog/index.js +151 -151
  49. package/dist/features/blog/index.mjs +4 -4
  50. package/dist/features/blog/server.js +17 -17
  51. package/dist/features/blog/server.mjs +2 -2
  52. package/dist/features/help/index.js +38 -38
  53. package/dist/features/help/index.mjs +4 -4
  54. package/dist/features/tokenusage/index.js +127 -127
  55. package/dist/features/tokenusage/index.mjs +4 -4
  56. package/dist/index.d.mts +1 -1
  57. package/dist/index.d.ts +1 -1
  58. package/dist/index.js +4 -4
  59. package/dist/index.mjs +3 -3
  60. package/dist/offline/index.js +14 -14
  61. package/dist/offline/index.mjs +1 -1
  62. package/dist/server/index.js +4 -4
  63. package/dist/server/index.mjs +3 -3
  64. package/messages/en.json +8 -0
  65. package/messages/it.json +8 -0
  66. package/package.json +1 -1
  67. package/src/core/registry/ModuleRegistry.ts +1 -0
  68. package/src/features/analytics/analytics.modules.ts +6 -0
  69. package/src/features/analytics/components/AnalyticsAdminContainer.tsx +20 -0
  70. package/src/features/analytics/components/AnalyticsDailyUniquesChart.tsx +224 -0
  71. package/src/features/analytics/components/__tests__/AnalyticsDailyUniquesChart.spec.tsx +88 -0
  72. package/src/features/analytics/components/__tests__/AnalyticsPageContainers.spec.tsx +22 -0
  73. package/src/features/analytics/contexts/AnalyticsAdminContext.tsx +15 -2
  74. package/src/features/analytics/contexts/__tests__/AnalyticsAdminContext.spec.tsx +38 -0
  75. package/src/features/analytics/data/AnalyticsAdminService.ts +20 -0
  76. package/src/features/analytics/data/__tests__/AnalyticsAdminService.spec.ts +15 -0
  77. package/src/features/analytics/data/__tests__/models.spec.ts +29 -0
  78. package/src/features/analytics/data/analytics-daily-unique-timeline.interface.ts +11 -0
  79. package/src/features/analytics/data/analytics-daily-unique-timeline.ts +53 -0
  80. package/src/features/analytics/data/analytics.types.ts +10 -0
  81. package/src/features/analytics/data/index.ts +2 -0
  82. package/src/features/analytics/i18n-keys.ts +8 -0
  83. package/src/features/analytics/index.ts +1 -0
  84. package/dist/chunk-KMPBSOFB.mjs.map +0 -1
  85. package/dist/chunk-OKBJEIOP.mjs.map +0 -1
  86. package/dist/chunk-OO2DBP6L.js.map +0 -1
  87. /package/dist/{BlockNoteEditor-5HSL74IX.mjs.map → BlockNoteEditor-7JRJ3XWV.mjs.map} +0 -0
  88. /package/dist/{BlockNoteViewer-X4UEVI2A.mjs.map → BlockNoteViewer-UKYEU3E3.mjs.map} +0 -0
  89. /package/dist/{chunk-YVKWACDP.mjs.map → chunk-LSZZIQJ5.mjs.map} +0 -0
  90. /package/dist/{chunk-HEDHJAKT.mjs.map → chunk-NKXNOGMH.mjs.map} +0 -0
  91. /package/dist/{chunk-TY5YWBLL.mjs.map → chunk-SJ3K3ATF.mjs.map} +0 -0
@@ -31,9 +31,9 @@
31
31
 
32
32
 
33
33
 
34
- var _chunkB4ZH2FOCjs = require('../../chunk-B4ZH2FOC.js');
34
+ var _chunkIN2F6HI2js = require('../../chunk-IN2F6HI2.js');
35
35
  require('../../chunk-3EPNHTMH.js');
36
- require('../../chunk-I5BQLY7V.js');
36
+ require('../../chunk-MVAIYPIN.js');
37
37
  require('../../chunk-G4JR3SFV.js');
38
38
 
39
39
 
@@ -45,12 +45,14 @@ require('../../chunk-G4JR3SFV.js');
45
45
 
46
46
 
47
47
 
48
- var _chunkOO2DBP6Ljs = require('../../chunk-OO2DBP6L.js');
48
+
49
+
50
+ var _chunkSGLFQ55Ujs = require('../../chunk-SGLFQ55U.js');
49
51
  require('../../chunk-DGN3PR2F.js');
50
52
 
51
53
 
52
54
 
53
- var _chunkA7Y5YW7Qjs = require('../../chunk-A7Y5YW7Q.js');
55
+ var _chunkV7CHD7QTjs = require('../../chunk-V7CHD7QT.js');
54
56
  require('../../chunk-KV4N7DEG.js');
55
57
  require('../../chunk-WCEYT3GG.js');
56
58
  require('../../chunk-WUNSG3IN.js');
@@ -66,7 +68,7 @@ var _react = require('react');
66
68
  var _uuid = require('uuid');
67
69
 
68
70
  // src/features/analytics/data/AnalyticsService.ts
69
- var AnalyticsService = class extends _chunkOO2DBP6Ljs.AbstractService {
71
+ var AnalyticsService = class extends _chunkSGLFQ55Ujs.AbstractService {
70
72
  static {
71
73
  _chunk7QVYU63Ejs.__name.call(void 0, this, "AnalyticsService");
72
74
  }
@@ -78,9 +80,9 @@ var AnalyticsService = class extends _chunkOO2DBP6Ljs.AbstractService {
78
80
  static async track(input) {
79
81
  try {
80
82
  await this.callApi({
81
- type: _chunkA7Y5YW7Qjs.Modules.AnalyticsEvent,
83
+ type: _chunkV7CHD7QTjs.Modules.AnalyticsEvent,
82
84
  method: "POST" /* POST */,
83
- endpoint: new (0, _chunkA7Y5YW7Qjs.EndpointCreator)({ endpoint: _chunkA7Y5YW7Qjs.Modules.AnalyticsEvent }).generate(),
85
+ endpoint: new (0, _chunkV7CHD7QTjs.EndpointCreator)({ endpoint: _chunkV7CHD7QTjs.Modules.AnalyticsEvent }).generate(),
84
86
  input,
85
87
  suppressGlobalError: true
86
88
  });
@@ -229,7 +231,7 @@ function AnalyticsAdminFilterBar({ section, granularity, onChange }) {
229
231
  };
230
232
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-wrap items-center gap-2", children: [
231
233
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "max-md:w-full max-md:[&_#date]:w-full", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
232
- _chunkB4ZH2FOCjs.DateRangeSelector,
234
+ _chunkIN2F6HI2js.DateRangeSelector,
233
235
  {
234
236
  onDateChange: (range) => {
235
237
  if (!_optionalChain([range, 'optionalAccess', _ => _.from]) || !_optionalChain([range, 'optionalAccess', _2 => _2.to])) return;
@@ -273,13 +275,13 @@ function Segmented({
273
275
  children: options.map((option) => {
274
276
  const selected = option.value === value;
275
277
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
276
- _chunkB4ZH2FOCjs.Button,
278
+ _chunkIN2F6HI2js.Button,
277
279
  {
278
280
  type: "button",
279
281
  size: "sm",
280
282
  variant: selected ? "default" : "ghost",
281
283
  "aria-pressed": selected,
282
- className: _chunkOO2DBP6Ljs.cn.call(void 0, !selected && "text-muted-foreground"),
284
+ className: _chunkSGLFQ55Ujs.cn.call(void 0, !selected && "text-muted-foreground"),
283
285
  onClick: () => onSelect(option.value),
284
286
  children: option.label
285
287
  },
@@ -299,45 +301,59 @@ function withFilters(endpoint, filters) {
299
301
  return endpoint;
300
302
  }
301
303
  _chunk7QVYU63Ejs.__name.call(void 0, withFilters, "withFilters");
302
- var AnalyticsAdminService = class extends _chunkOO2DBP6Ljs.AbstractService {
304
+ var AnalyticsAdminService = class extends _chunkSGLFQ55Ujs.AbstractService {
303
305
  static {
304
306
  _chunk7QVYU63Ejs.__name.call(void 0, this, "AnalyticsAdminService");
305
307
  }
306
308
  /** Headline tiles: one row per window (current, previous). */
307
309
  static async getSummary(filters) {
308
- const endpoint = withFilters(new (0, _chunkA7Y5YW7Qjs.EndpointCreator)({ endpoint: _chunkA7Y5YW7Qjs.Modules.AnalyticsSummary }), filters);
310
+ const endpoint = withFilters(new (0, _chunkV7CHD7QTjs.EndpointCreator)({ endpoint: _chunkV7CHD7QTjs.Modules.AnalyticsSummary }), filters);
309
311
  return this.callApi({
310
- type: _chunkA7Y5YW7Qjs.Modules.AnalyticsSummary,
312
+ type: _chunkV7CHD7QTjs.Modules.AnalyticsSummary,
311
313
  method: "GET" /* GET */,
312
314
  endpoint: endpoint.generate()
313
315
  });
314
316
  }
315
317
  static async getTimeline(params) {
316
- const endpoint = withFilters(new (0, _chunkA7Y5YW7Qjs.EndpointCreator)({ endpoint: _chunkA7Y5YW7Qjs.Modules.AnalyticsTimeline }), params);
318
+ const endpoint = withFilters(new (0, _chunkV7CHD7QTjs.EndpointCreator)({ endpoint: _chunkV7CHD7QTjs.Modules.AnalyticsTimeline }), params);
317
319
  endpoint.addAdditionalParam("granularity", params.granularity);
318
320
  return this.callApi({
319
- type: _chunkA7Y5YW7Qjs.Modules.AnalyticsTimeline,
321
+ type: _chunkV7CHD7QTjs.Modules.AnalyticsTimeline,
322
+ method: "GET" /* GET */,
323
+ endpoint: endpoint.generate()
324
+ });
325
+ }
326
+ /**
327
+ * One row per calendar day from fromDate to toDate (YYYY-MM-DD, local dates).
328
+ * Always daily and never filtered by section, so it skips withFilters.
329
+ */
330
+ static async getDailyUniques(params) {
331
+ const endpoint = new (0, _chunkV7CHD7QTjs.EndpointCreator)({ endpoint: _chunkV7CHD7QTjs.Modules.AnalyticsDailyUniqueTimeline });
332
+ endpoint.addAdditionalParam("fromDate", params.fromDate);
333
+ endpoint.addAdditionalParam("toDate", params.toDate);
334
+ return this.callApi({
335
+ type: _chunkV7CHD7QTjs.Modules.AnalyticsDailyUniqueTimeline,
320
336
  method: "GET" /* GET */,
321
337
  endpoint: endpoint.generate()
322
338
  });
323
339
  }
324
340
  static async getBreakdown(params) {
325
- const endpoint = withFilters(new (0, _chunkA7Y5YW7Qjs.EndpointCreator)({ endpoint: _chunkA7Y5YW7Qjs.Modules.AnalyticsBreakdown }), params);
341
+ const endpoint = withFilters(new (0, _chunkV7CHD7QTjs.EndpointCreator)({ endpoint: _chunkV7CHD7QTjs.Modules.AnalyticsBreakdown }), params);
326
342
  endpoint.addAdditionalParam("dimension", params.dimension);
327
343
  if (params.limit !== void 0) endpoint.addAdditionalParam("limit", String(params.limit));
328
344
  return this.callApi({
329
- type: _chunkA7Y5YW7Qjs.Modules.AnalyticsBreakdown,
345
+ type: _chunkV7CHD7QTjs.Modules.AnalyticsBreakdown,
330
346
  method: "GET" /* GET */,
331
347
  endpoint: endpoint.generate()
332
348
  });
333
349
  }
334
350
  /** Newest sessions first, cursor-paginated through `next`. */
335
351
  static async getSessions(params) {
336
- const endpoint = withFilters(new (0, _chunkA7Y5YW7Qjs.EndpointCreator)({ endpoint: _chunkA7Y5YW7Qjs.Modules.AnalyticsSession }), params);
352
+ const endpoint = withFilters(new (0, _chunkV7CHD7QTjs.EndpointCreator)({ endpoint: _chunkV7CHD7QTjs.Modules.AnalyticsSession }), params);
337
353
  if (params.visitorId) endpoint.addAdditionalParam("visitorId", params.visitorId);
338
354
  if (params.userId) endpoint.addAdditionalParam("userId", params.userId);
339
355
  return this.callApi({
340
- type: _chunkA7Y5YW7Qjs.Modules.AnalyticsSession,
356
+ type: _chunkV7CHD7QTjs.Modules.AnalyticsSession,
341
357
  method: "GET" /* GET */,
342
358
  endpoint: endpoint.generate(),
343
359
  next: params.next
@@ -345,20 +361,20 @@ var AnalyticsAdminService = class extends _chunkOO2DBP6Ljs.AbstractService {
345
361
  }
346
362
  static async getSession(params) {
347
363
  return this.callApi({
348
- type: _chunkA7Y5YW7Qjs.Modules.AnalyticsSession,
364
+ type: _chunkV7CHD7QTjs.Modules.AnalyticsSession,
349
365
  method: "GET" /* GET */,
350
- endpoint: new (0, _chunkA7Y5YW7Qjs.EndpointCreator)({ endpoint: _chunkA7Y5YW7Qjs.Modules.AnalyticsSession, id: params.id }).generate()
366
+ endpoint: new (0, _chunkV7CHD7QTjs.EndpointCreator)({ endpoint: _chunkV7CHD7QTjs.Modules.AnalyticsSession, id: params.id }).generate()
351
367
  });
352
368
  }
353
369
  /** The journey: every page view of one session, oldest first. */
354
370
  static async getSessionPageViews(params) {
355
371
  return this.callApi({
356
- type: _chunkA7Y5YW7Qjs.Modules.AnalyticsPageView,
372
+ type: _chunkV7CHD7QTjs.Modules.AnalyticsPageView,
357
373
  method: "GET" /* GET */,
358
- endpoint: new (0, _chunkA7Y5YW7Qjs.EndpointCreator)({
359
- endpoint: _chunkA7Y5YW7Qjs.Modules.AnalyticsSession,
374
+ endpoint: new (0, _chunkV7CHD7QTjs.EndpointCreator)({
375
+ endpoint: _chunkV7CHD7QTjs.Modules.AnalyticsSession,
360
376
  id: params.sessionId,
361
- childEndpoint: _chunkA7Y5YW7Qjs.Modules.AnalyticsPageView
377
+ childEndpoint: _chunkV7CHD7QTjs.Modules.AnalyticsPageView
362
378
  }).generate()
363
379
  });
364
380
  }
@@ -404,6 +420,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
404
420
  const [timeline, setTimeline] = _react.useState.call(void 0, []);
405
421
  const [breakdowns, setBreakdowns] = _react.useState.call(void 0, EMPTY_BREAKDOWNS);
406
422
  const [sessions, setSessions] = _react.useState.call(void 0, []);
423
+ const [dailyUniques, setDailyUniques] = _react.useState.call(void 0, []);
407
424
  const [sessionsNextPage, setSessionsNextPage] = _react.useState.call(void 0, void 0);
408
425
  const [isLoading, setIsLoading] = _react.useState.call(void 0, true);
409
426
  const [error, setError] = _react.useState.call(void 0, null);
@@ -422,8 +439,14 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
422
439
  (dimension) => AnalyticsAdminService.getBreakdown({ ...base, dimension, limit: BREAKDOWN_LIMIT })
423
440
  )
424
441
  ),
425
- AnalyticsAdminService.getSessions({ ...base, next: sessionsNext })
426
- ]).then(([nextSummary, nextTimeline, nextBreakdowns, nextSessions]) => {
442
+ AnalyticsAdminService.getSessions({ ...base, next: sessionsNext }),
443
+ // The local calendar days the admin picked: the picker emits local-midnight
444
+ // instants, so slicing the UTC instant would shift the range a day east of UTC.
445
+ AnalyticsAdminService.getDailyUniques({
446
+ fromDate: _chunkSGLFQ55Ujs.formatLocalDate.call(void 0, new Date(from)),
447
+ toDate: _chunkSGLFQ55Ujs.formatLocalDate.call(void 0, new Date(to))
448
+ })
449
+ ]).then(([nextSummary, nextTimeline, nextBreakdowns, nextSessions, nextDailyUniques]) => {
427
450
  if (cancelled) return;
428
451
  setSummary(_nullishCoalesce(nextSummary, () => ( [])));
429
452
  setTimeline(_nullishCoalesce(nextTimeline, () => ( [])));
@@ -434,6 +457,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
434
457
  );
435
458
  setSessions(_nullishCoalesce(nextSessions, () => ( [])));
436
459
  setSessionsNextPage(sessionsNext.next);
460
+ setDailyUniques(_nullishCoalesce(nextDailyUniques, () => ( [])));
437
461
  }).catch((err) => {
438
462
  if (cancelled) return;
439
463
  console.error("Failed to load analytics:", err);
@@ -454,7 +478,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
454
478
  const sessionsNext = {};
455
479
  try {
456
480
  const nextSessions = await AnalyticsAdminService.next({
457
- type: _chunkA7Y5YW7Qjs.Modules.AnalyticsSession,
481
+ type: _chunkV7CHD7QTjs.Modules.AnalyticsSession,
458
482
  endpoint: sessionsNextPage,
459
483
  next: sessionsNext
460
484
  });
@@ -487,6 +511,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
487
511
  timeline,
488
512
  breakdowns,
489
513
  sessions,
514
+ dailyUniques,
490
515
  filters,
491
516
  setFilters,
492
517
  loadMoreSessions,
@@ -500,6 +525,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
500
525
  timeline,
501
526
  breakdowns,
502
527
  sessions,
528
+ dailyUniques,
503
529
  filters,
504
530
  setFilters,
505
531
  loadMoreSessions,
@@ -509,7 +535,7 @@ var AnalyticsAdminProvider = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0
509
535
  error
510
536
  ]
511
537
  );
512
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.SharedProvider, { value: { breadcrumbs: breadcrumb(), title: title() }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsAdminContext.Provider, { value: contextValue, children }) });
538
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.SharedProvider, { value: { breadcrumbs: breadcrumb(), title: title() }, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsAdminContext.Provider, { value: contextValue, children }) });
513
539
  }, "AnalyticsAdminProvider");
514
540
  var useAnalyticsAdmin = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, () => {
515
541
  const ctx = _react.useContext.call(void 0, AnalyticsAdminContext);
@@ -529,7 +555,7 @@ var _lucidereact = require('lucide-react');
529
555
  var ZERO = { visitors: 0, sessions: 0, pageViews: 0, pagesPerSession: 0, consentShare: 0 };
530
556
  function AnalyticsAdminTiles({ summary }) {
531
557
  const t = _nextintl.useTranslations.call(void 0, );
532
- const { decimal } = _chunkB4ZH2FOCjs.useUsageFormatters.call(void 0, );
558
+ const { decimal } = _chunkIN2F6HI2js.useUsageFormatters.call(void 0, );
533
559
  const rowFor = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (window2) => _nullishCoalesce(summary.find((r) => r.section === "total" && r.window === window2), () => ( ZERO)), "rowFor");
534
560
  const current = rowFor("current");
535
561
  const previous = rowFor("previous");
@@ -542,7 +568,7 @@ function AnalyticsAdminTiles({ summary }) {
542
568
  testId: "analytics-tile-visitors",
543
569
  label: t("analytics.admin.tiles.visitors"),
544
570
  value: decimal(current.visitors, 0),
545
- delta: _chunkB4ZH2FOCjs.percentageDelta.call(void 0, current.visitors, previous.visitors),
571
+ delta: _chunkIN2F6HI2js.percentageDelta.call(void 0, current.visitors, previous.visitors),
546
572
  previousLabel,
547
573
  decimal
548
574
  }
@@ -553,7 +579,7 @@ function AnalyticsAdminTiles({ summary }) {
553
579
  testId: "analytics-tile-sessions",
554
580
  label: t("analytics.admin.tiles.sessions"),
555
581
  value: decimal(current.sessions, 0),
556
- delta: _chunkB4ZH2FOCjs.percentageDelta.call(void 0, current.sessions, previous.sessions),
582
+ delta: _chunkIN2F6HI2js.percentageDelta.call(void 0, current.sessions, previous.sessions),
557
583
  previousLabel,
558
584
  decimal
559
585
  }
@@ -564,7 +590,7 @@ function AnalyticsAdminTiles({ summary }) {
564
590
  testId: "analytics-tile-page-views",
565
591
  label: t("analytics.admin.tiles.page_views"),
566
592
  value: decimal(current.pageViews, 0),
567
- delta: _chunkB4ZH2FOCjs.percentageDelta.call(void 0, current.pageViews, previous.pageViews),
593
+ delta: _chunkIN2F6HI2js.percentageDelta.call(void 0, current.pageViews, previous.pageViews),
568
594
  previousLabel,
569
595
  decimal
570
596
  }
@@ -577,7 +603,7 @@ function AnalyticsAdminTiles({ summary }) {
577
603
  testId: "analytics-tile-pages-per-session",
578
604
  label: t("analytics.admin.tiles.pages_per_session"),
579
605
  value: decimal(current.pagesPerSession, 1),
580
- delta: _chunkB4ZH2FOCjs.percentageDelta.call(void 0, current.pagesPerSession, previous.pagesPerSession),
606
+ delta: _chunkIN2F6HI2js.percentageDelta.call(void 0, current.pagesPerSession, previous.pagesPerSession),
581
607
  decimal
582
608
  }
583
609
  ),
@@ -602,8 +628,8 @@ function LeadTile({
602
628
  previousLabel,
603
629
  decimal
604
630
  }) {
605
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.Card, { "data-testid": testId, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.CardContent, { className: "grid gap-1", children: [
606
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.MicroLabel, { children: label }),
631
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.Card, { "data-testid": testId, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.CardContent, { className: "grid gap-1", children: [
632
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.MicroLabel, { children: label }),
607
633
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-primary text-xl font-semibold tabular-nums", children: value }),
608
634
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex items-center gap-1", children: [
609
635
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Delta, { testId: `${testId}-delta`, delta, decimal }),
@@ -619,8 +645,8 @@ function SupportingTile({
619
645
  delta,
620
646
  decimal
621
647
  }) {
622
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.Card, { "data-testid": testId, size: "sm", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.CardContent, { className: "grid gap-1", children: [
623
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.MicroLabel, { children: label }),
648
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.Card, { "data-testid": testId, size: "sm", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.CardContent, { className: "grid gap-1", children: [
649
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.MicroLabel, { children: label }),
624
650
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex items-center gap-2", children: [
625
651
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-sm font-medium tabular-nums", children: value }),
626
652
  delta !== void 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Delta, { testId: `${testId}-delta`, delta, decimal })
@@ -643,7 +669,7 @@ function Delta({
643
669
  "span",
644
670
  {
645
671
  "data-testid": testId,
646
- className: _chunkOO2DBP6Ljs.cn.call(void 0,
672
+ className: _chunkSGLFQ55Ujs.cn.call(void 0,
647
673
  "inline-flex items-center gap-0.5 text-xs tabular-nums",
648
674
  increased ? "text-success" : "text-destructive"
649
675
  ),
@@ -671,15 +697,15 @@ function AnalyticsBreakdownTable({ breakdowns }) {
671
697
  route: t("analytics.admin.dimensions.route"),
672
698
  landing: t("analytics.admin.dimensions.landing")
673
699
  };
674
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.Tabs, { defaultValue: ANALYTICS_DIMENSIONS[0], children: [
675
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TabsList, { className: "max-md:w-full max-md:justify-start max-md:overflow-x-auto", children: ANALYTICS_DIMENSIONS.map((dimension) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TabsTrigger, { value: dimension, children: labels[dimension] }, dimension)) }),
676
- ANALYTICS_DIMENSIONS.map((dimension) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TabsContent, { value: dimension, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, BreakdownRows, { rows: _nullishCoalesce(breakdowns[dimension], () => ( [])) }) }, dimension))
700
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.Tabs, { defaultValue: ANALYTICS_DIMENSIONS[0], children: [
701
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TabsList, { className: "max-md:w-full max-md:justify-start max-md:overflow-x-auto", children: ANALYTICS_DIMENSIONS.map((dimension) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TabsTrigger, { value: dimension, children: labels[dimension] }, dimension)) }),
702
+ ANALYTICS_DIMENSIONS.map((dimension) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TabsContent, { value: dimension, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, BreakdownRows, { rows: _nullishCoalesce(breakdowns[dimension], () => ( [])) }) }, dimension))
677
703
  ] });
678
704
  }
679
705
  _chunk7QVYU63Ejs.__name.call(void 0, AnalyticsBreakdownTable, "AnalyticsBreakdownTable");
680
706
  function BreakdownRows({ rows }) {
681
707
  const t = _nextintl.useTranslations.call(void 0, );
682
- const { decimal } = _chunkB4ZH2FOCjs.useUsageFormatters.call(void 0, );
708
+ const { decimal } = _chunkIN2F6HI2js.useUsageFormatters.call(void 0, );
683
709
  const sortedRows = _react.useMemo.call(void 0, () => [...rows].sort((a, b) => b.visitors - a.visitors), [rows]);
684
710
  if (sortedRows.length === 0) {
685
711
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm", children: t("analytics.admin.no_data") });
@@ -688,24 +714,172 @@ function BreakdownRows({ rows }) {
688
714
  // The package's <Table> wraps itself in an `overflow-x-clip` container, which
689
715
  // would swallow the overflow before this scroller ever saw it — hence the
690
716
  // child override. Wide tables must scroll, never widen the page.
691
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.Table, { children: [
692
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHeader, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.TableRow, { children: [
693
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.key") }),
694
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.visitors") }),
695
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.sessions") }),
696
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.page_views") })
717
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.Table, { children: [
718
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHeader, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.TableRow, { children: [
719
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.key") }),
720
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.visitors") }),
721
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.sessions") }),
722
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.page_views") })
697
723
  ] }) }),
698
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableBody, { children: sortedRows.map((row) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.TableRow, { "data-testid": `analytics-breakdown-row-${row.id}`, children: [
699
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-xs", children: row.key === OTHER_KEY ? t("analytics.admin.other") : row.key }),
700
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.visitors, 0) }),
701
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.sessions, 0) }),
702
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.pageViews, 0) })
724
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableBody, { children: sortedRows.map((row) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.TableRow, { "data-testid": `analytics-breakdown-row-${row.id}`, children: [
725
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-xs", children: row.key === OTHER_KEY ? t("analytics.admin.other") : row.key }),
726
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.visitors, 0) }),
727
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.sessions, 0) }),
728
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.pageViews, 0) })
703
729
  ] }, row.id)) })
704
730
  ] }) })
705
731
  );
706
732
  }
707
733
  _chunk7QVYU63Ejs.__name.call(void 0, BreakdownRows, "BreakdownRows");
708
734
 
735
+ // src/features/analytics/components/AnalyticsDailyUniquesChart.tsx
736
+
737
+ var _nextthemes = require('next-themes');
738
+
739
+ var _recharts = require('recharts');
740
+
741
+ var METRIC_SLOT = { visitors: 0, users: 2 };
742
+ var DOT_RADIUS = 4;
743
+ var bucketKey = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (date) => {
744
+ const y = date.getUTCFullYear();
745
+ const m = `${date.getUTCMonth() + 1}`.padStart(2, "0");
746
+ const d = `${date.getUTCDate()}`.padStart(2, "0");
747
+ return `${y}-${m}-${d}`;
748
+ }, "bucketKey");
749
+ function buildDailyUniquesSeries(rows, metric, todayKey) {
750
+ const entries = rows.map((row) => {
751
+ const day = bucketKey(row.day);
752
+ const value = _nullishCoalesce(row[metric], () => ( null));
753
+ return { day, value, line: value, todayLine: null, isToday: day === todayKey };
754
+ });
755
+ const last = entries.length - 1;
756
+ if (last >= 1 && entries[last].isToday && entries[last].value !== null && entries[last - 1].value !== null) {
757
+ entries[last - 1].todayLine = entries[last - 1].value;
758
+ entries[last].todayLine = entries[last].value;
759
+ entries[last].line = null;
760
+ }
761
+ return entries;
762
+ }
763
+ _chunk7QVYU63Ejs.__name.call(void 0, buildDailyUniquesSeries, "buildDailyUniquesSeries");
764
+ function AnalyticsDailyUniquesChart({ rows, metric, className }) {
765
+ const t = _nextintl.useTranslations.call(void 0, );
766
+ const { compact, bucketDate, decimal } = _chunkIN2F6HI2js.useUsageFormatters.call(void 0, );
767
+ const { resolvedTheme } = _nextthemes.useTheme.call(void 0, );
768
+ const mode = resolvedTheme === "dark" ? "dark" : "light";
769
+ const color = _chunkIN2F6HI2js.seriesColor.call(void 0, METRIC_SLOT[metric], mode);
770
+ const chartData = _react.useMemo.call(void 0, () => buildDailyUniquesSeries(rows, metric, bucketKey(/* @__PURE__ */ new Date())), [rows, metric]);
771
+ const points = _react.useMemo.call(void 0, () => chartData.map(({ day, value }) => ({ day, value })), [chartData]);
772
+ const seriesLabel = t(`analytics.admin.daily_uniques.${metric}`);
773
+ const chartConfig = _react.useMemo.call(void 0, () => ({ line: { label: seriesLabel, color } }), [seriesLabel, color]);
774
+ if (chartData.length === 0) {
775
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: className ? `text-muted-foreground text-xs ${className}` : "text-muted-foreground text-xs", children: t("analytics.admin.no_data") });
776
+ }
777
+ const renderDot = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, ({ cx, cy, index, payload }) => {
778
+ if (cx == null || cy == null || _optionalChain([payload, 'optionalAccess', _3 => _3.value]) == null) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "g", {}, `dot-${index}`);
779
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
780
+ "circle",
781
+ {
782
+ cx,
783
+ cy,
784
+ r: DOT_RADIUS,
785
+ fill: payload.isToday ? "var(--card)" : color,
786
+ stroke: payload.isToday ? color : "var(--card)",
787
+ strokeWidth: 2
788
+ },
789
+ `dot-${index}`
790
+ );
791
+ }, "renderDot");
792
+ const renderTodayDot = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (props) => _optionalChain([props, 'access', _4 => _4.payload, 'optionalAccess', _5 => _5.isToday]) ? renderDot(props) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "g", {}, `today-dot-${props.index}`), "renderTodayDot");
793
+ return (
794
+ // The chart is a coordinate system, not prose: it stays an LTR island.
795
+ // rtl-ok: deliberate LTR island (chart)
796
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className, dir: "ltr", children: [
797
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "sr-only", "data-testid": `analytics-daily-${metric}-data`, children: JSON.stringify(points) }),
798
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.ChartContainer, { config: chartConfig, className: "aspect-auto h-72 w-full", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _recharts.LineChart, { accessibilityLayer: true, data: chartData, margin: { top: 8, right: 16, bottom: 0, left: 0 }, children: [
799
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _recharts.CartesianGrid, { vertical: false }),
800
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
801
+ _recharts.XAxis,
802
+ {
803
+ dataKey: "day",
804
+ tickLine: false,
805
+ axisLine: false,
806
+ tickMargin: 8,
807
+ minTickGap: 16,
808
+ tickFormatter: (value) => bucketDate(value, "day")
809
+ }
810
+ ),
811
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
812
+ _recharts.YAxis,
813
+ {
814
+ domain: [0, "auto"],
815
+ allowDecimals: false,
816
+ tickLine: false,
817
+ axisLine: false,
818
+ tickMargin: 8,
819
+ width: 48,
820
+ tickFormatter: (value) => compact(value)
821
+ }
822
+ ),
823
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
824
+ _chunkIN2F6HI2js.ChartTooltip,
825
+ {
826
+ filterNull: false,
827
+ content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
828
+ _chunkIN2F6HI2js.ChartTooltipContent,
829
+ {
830
+ labelFormatter: (value, payload) => {
831
+ const entry = _optionalChain([payload, 'optionalAccess', _6 => _6[0], 'optionalAccess', _7 => _7.payload]);
832
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
833
+ bucketDate(String(value), "day"),
834
+ _optionalChain([entry, 'optionalAccess', _8 => _8.isToday]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-muted-foreground text-xs", children: t("analytics.admin.daily_uniques.today") })
835
+ ] });
836
+ },
837
+ formatter: (_value, _name, item) => {
838
+ const entry = item.payload;
839
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-1 justify-between gap-4 leading-none", children: [
840
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-muted-foreground", children: seriesLabel }),
841
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-xs tabular-nums text-end", children: entry.value === null ? t("analytics.admin.daily_uniques.no_data") : decimal(entry.value, 0) })
842
+ ] });
843
+ }
844
+ }
845
+ )
846
+ }
847
+ ),
848
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
849
+ _recharts.Line,
850
+ {
851
+ dataKey: "line",
852
+ type: "linear",
853
+ stroke: color,
854
+ strokeWidth: 2,
855
+ connectNulls: false,
856
+ dot: renderDot,
857
+ activeDot: { r: DOT_RADIUS, strokeWidth: 2, stroke: "var(--card)" },
858
+ isAnimationActive: false
859
+ }
860
+ ),
861
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
862
+ _recharts.Line,
863
+ {
864
+ dataKey: "todayLine",
865
+ type: "linear",
866
+ stroke: color,
867
+ strokeWidth: 2,
868
+ strokeDasharray: "2 5",
869
+ connectNulls: false,
870
+ dot: renderTodayDot,
871
+ activeDot: false,
872
+ tooltipType: "none",
873
+ legendType: "none",
874
+ isAnimationActive: false
875
+ }
876
+ )
877
+ ] }) })
878
+ ] })
879
+ );
880
+ }
881
+ _chunk7QVYU63Ejs.__name.call(void 0, AnalyticsDailyUniquesChart, "AnalyticsDailyUniquesChart");
882
+
709
883
  // src/features/analytics/components/AnalyticsSessionsTable.tsx
710
884
 
711
885
 
@@ -714,60 +888,60 @@ var VISITOR_SUFFIX_LENGTH = 6;
714
888
  function AnalyticsSessionsTable({ rows, sessionPageUrl, onLoadMore, hasMore }) {
715
889
  const t = _nextintl.useTranslations.call(void 0, );
716
890
  const locale = _nextintl.useLocale.call(void 0, );
717
- const generateUrl = _chunkB4ZH2FOCjs.usePageUrlGenerator.call(void 0, );
718
- const { decimal } = _chunkB4ZH2FOCjs.useUsageFormatters.call(void 0, );
891
+ const generateUrl = _chunkIN2F6HI2js.usePageUrlGenerator.call(void 0, );
892
+ const { decimal } = _chunkIN2F6HI2js.useUsageFormatters.call(void 0, );
719
893
  const dateTime = _react.useMemo.call(void 0, () => new Intl.DateTimeFormat(locale, { dateStyle: "short", timeStyle: "short" }), [locale]);
720
894
  if (rows.length === 0) {
721
895
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm", children: t("analytics.admin.no_data") });
722
896
  }
723
897
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-3", children: [
724
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.Table, { children: [
725
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHeader, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.TableRow, { children: [
726
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.started") }),
727
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.visitor") }),
728
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.source") }),
729
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.landing") }),
730
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.pages") }),
731
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.device") })
898
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.Table, { children: [
899
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHeader, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.TableRow, { children: [
900
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.started") }),
901
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.visitor") }),
902
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.source") }),
903
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.landing") }),
904
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.pages") }),
905
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.device") })
732
906
  ] }) }),
733
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableBody, { children: rows.map((row) => {
907
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableBody, { children: rows.map((row) => {
734
908
  const source = [_nullishCoalesce(row.utmSource, () => ( row.referrerHost)), row.utmMedium].filter(Boolean).join(" / ");
735
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.TableRow, { "data-testid": `analytics-session-row-${row.id}`, children: [
736
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-xs tabular-nums", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
737
- _chunkB4ZH2FOCjs.Link,
909
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.TableRow, { "data-testid": `analytics-session-row-${row.id}`, children: [
910
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-xs tabular-nums", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
911
+ _chunkIN2F6HI2js.Link,
738
912
  {
739
913
  href: generateUrl({ page: sessionPageUrl, id: row.id }),
740
914
  "data-testid": `analytics-session-link-${row.id}`,
741
915
  children: dateTime.format(row.startedAt)
742
916
  }
743
917
  ) }),
744
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-xs", children: row.user ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex flex-col", children: [
918
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-xs", children: row.user ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex flex-col", children: [
745
919
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: row.user.name }),
746
920
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-muted-foreground text-xs", children: row.user.email })
747
921
  ] }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex items-center gap-2", children: [
748
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.Badge, { variant: "softGray", children: t("analytics.admin.anonymous") }),
922
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.Badge, { variant: "softGray", children: t("analytics.admin.anonymous") }),
749
923
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-muted-foreground text-xs tabular-nums", children: row.visitorId.slice(-VISITOR_SUFFIX_LENGTH) })
750
924
  ] }) }),
751
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-xs", children: source }),
752
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-xs", children: row.landingRoute }),
753
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.pageViews, 0) }),
754
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-muted-foreground text-xs", children: row.deviceType })
925
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-xs", children: source }),
926
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-xs", children: row.landingRoute }),
927
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-end text-xs tabular-nums", children: decimal(row.pageViews, 0) }),
928
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-muted-foreground text-xs", children: row.deviceType })
755
929
  ] }, row.id);
756
930
  }) })
757
931
  ] }) }),
758
- hasMore && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.Button, { type: "button", variant: "outline", size: "sm", onClick: onLoadMore, children: t("analytics.admin.load_more") }) })
932
+ hasMore && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex justify-center", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.Button, { type: "button", variant: "outline", size: "sm", onClick: onLoadMore, children: t("analytics.admin.load_more") }) })
759
933
  ] });
760
934
  }
761
935
  _chunk7QVYU63Ejs.__name.call(void 0, AnalyticsSessionsTable, "AnalyticsSessionsTable");
762
936
 
763
937
  // src/features/analytics/components/AnalyticsTimelineChart.tsx
764
938
 
765
- var _nextthemes = require('next-themes');
766
939
 
767
- var _recharts = require('recharts');
940
+
941
+
768
942
 
769
943
  var SERIES = ["visitors", "pageViews"];
770
- var bucketKey = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (date) => {
944
+ var bucketKey2 = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (date) => {
771
945
  const y = date.getUTCFullYear();
772
946
  const m = `${date.getUTCMonth() + 1}`.padStart(2, "0");
773
947
  const d = `${date.getUTCDate()}`.padStart(2, "0");
@@ -787,13 +961,13 @@ var inferGranularity = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, (buc
787
961
  }, "inferGranularity");
788
962
  function AnalyticsTimelineChart({ rows, className }) {
789
963
  const t = _nextintl.useTranslations.call(void 0, );
790
- const { compact, bucketDate, decimal } = _chunkB4ZH2FOCjs.useUsageFormatters.call(void 0, );
964
+ const { compact, bucketDate, decimal } = _chunkIN2F6HI2js.useUsageFormatters.call(void 0, );
791
965
  const { resolvedTheme } = _nextthemes.useTheme.call(void 0, );
792
966
  const mode = resolvedTheme === "dark" ? "dark" : "light";
793
967
  const chartData = _react.useMemo.call(void 0, () => {
794
968
  const byBucket = /* @__PURE__ */ new Map();
795
969
  for (const row of rows) {
796
- const key = bucketKey(row.bucket);
970
+ const key = bucketKey2(row.bucket);
797
971
  let entry = byBucket.get(key);
798
972
  if (!entry) {
799
973
  entry = { bucket: key, visitors: 0, pageViews: 0 };
@@ -822,7 +996,7 @@ function AnalyticsTimelineChart({ rows, className }) {
822
996
  // rtl-ok: deliberate LTR island (chart)
823
997
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className, dir: "ltr", children: [
824
998
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "sr-only", "data-testid": "analytics-timeline-data", children: JSON.stringify(chartData) }),
825
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.ChartContainer, { config: chartConfig, className: "aspect-auto h-72 w-full", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _recharts.BarChart, { accessibilityLayer: true, data: chartData, margin: { top: 8, right: 8, bottom: 0, left: 0 }, children: [
999
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.ChartContainer, { config: chartConfig, className: "aspect-auto h-72 w-full", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _recharts.BarChart, { accessibilityLayer: true, data: chartData, margin: { top: 8, right: 8, bottom: 0, left: 0 }, children: [
826
1000
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _recharts.CartesianGrid, { vertical: false }),
827
1001
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
828
1002
  _recharts.XAxis,
@@ -846,10 +1020,10 @@ function AnalyticsTimelineChart({ rows, className }) {
846
1020
  }
847
1021
  ),
848
1022
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
849
- _chunkB4ZH2FOCjs.ChartTooltip,
1023
+ _chunkIN2F6HI2js.ChartTooltip,
850
1024
  {
851
1025
  content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
852
- _chunkB4ZH2FOCjs.ChartTooltipContent,
1026
+ _chunkIN2F6HI2js.ChartTooltipContent,
853
1027
  {
854
1028
  labelFormatter: (value) => bucketDate(String(value), granularity),
855
1029
  valueFormatter: (value) => decimal(Number(value), 0)
@@ -857,13 +1031,13 @@ function AnalyticsTimelineChart({ rows, className }) {
857
1031
  )
858
1032
  }
859
1033
  ),
860
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.ChartLegend, { content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.ChartLegendContent, {}) }),
1034
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.ChartLegend, { content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.ChartLegendContent, {}) }),
861
1035
  SERIES.map((series, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
862
1036
  _recharts.Bar,
863
1037
  {
864
1038
  dataKey: series,
865
1039
  maxBarSize: 28,
866
- fill: _chunkB4ZH2FOCjs.seriesColor.call(void 0, index, mode),
1040
+ fill: _chunkIN2F6HI2js.seriesColor.call(void 0, index, mode),
867
1041
  stroke: "var(--background)",
868
1042
  strokeWidth: 2,
869
1043
  radius: [4, 4, 0, 0]
@@ -885,6 +1059,7 @@ function AnalyticsAdminContainer() {
885
1059
  timeline,
886
1060
  breakdowns,
887
1061
  sessions,
1062
+ dailyUniques,
888
1063
  loadMoreSessions,
889
1064
  hasMoreSessions,
890
1065
  sessionPageUrl,
@@ -892,25 +1067,33 @@ function AnalyticsAdminContainer() {
892
1067
  error
893
1068
  } = useAnalyticsAdmin();
894
1069
  if (error) {
895
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.RoundPageContainer, { module: _chunkA7Y5YW7Qjs.Modules.AnalyticsSummary, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-4", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.Card, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-destructive text-xs/relaxed", children: error }) }) }) }) });
1070
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.RoundPageContainer, { module: _chunkV7CHD7QTjs.Modules.AnalyticsSummary, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-4", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.Card, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-destructive text-xs/relaxed", children: error }) }) }) }) });
896
1071
  }
897
- if (isLoading) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.RoundPageContainer, { module: _chunkA7Y5YW7Qjs.Modules.AnalyticsSummary, fullWidth: true, forceHeader: true });
898
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.RoundPageContainer, { module: _chunkA7Y5YW7Qjs.Modules.AnalyticsSummary, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex w-full flex-col gap-4 p-4", children: [
1072
+ if (isLoading) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.RoundPageContainer, { module: _chunkV7CHD7QTjs.Modules.AnalyticsSummary, fullWidth: true, forceHeader: true });
1073
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.RoundPageContainer, { module: _chunkV7CHD7QTjs.Modules.AnalyticsSummary, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex w-full flex-col gap-4 p-4", children: [
899
1074
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-2", children: [
900
1075
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsAdminTiles, { summary }),
901
1076
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-xs", children: t("analytics.admin.tiles.summarised_note") })
902
1077
  ] }),
903
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.Card, { children: [
904
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardTitle, { children: t("analytics.admin.panels.over_time") }) }),
905
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsTimelineChart, { rows: timeline }) })
1078
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.Card, { children: [
1079
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardTitle, { children: t("analytics.admin.panels.over_time") }) }),
1080
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsTimelineChart, { rows: timeline }) })
1081
+ ] }),
1082
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.Card, { "data-testid": "analytics-daily-visitors-card", children: [
1083
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardTitle, { children: t("analytics.admin.panels.daily_visitors") }) }),
1084
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsDailyUniquesChart, { rows: dailyUniques, metric: "visitors" }) })
1085
+ ] }),
1086
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.Card, { "data-testid": "analytics-daily-users-card", children: [
1087
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardTitle, { children: t("analytics.admin.panels.daily_users") }) }),
1088
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsDailyUniquesChart, { rows: dailyUniques, metric: "users" }) })
906
1089
  ] }),
907
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.Card, { children: [
908
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardTitle, { children: t("analytics.admin.panels.breakdown") }) }),
909
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsBreakdownTable, { breakdowns }) })
1090
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.Card, { children: [
1091
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardTitle, { children: t("analytics.admin.panels.breakdown") }) }),
1092
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsBreakdownTable, { breakdowns }) })
910
1093
  ] }),
911
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.Card, { children: [
912
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardTitle, { children: t("analytics.admin.panels.sessions") }) }),
913
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1094
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.Card, { children: [
1095
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardTitle, { children: t("analytics.admin.panels.sessions") }) }),
1096
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
914
1097
  AnalyticsSessionsTable,
915
1098
  {
916
1099
  rows: sessions,
@@ -933,7 +1116,7 @@ var OTHER_SESSIONS_WINDOW_DAYS = 395;
933
1116
  function AnalyticsJourneyContainer({ sessionId, pageUrl = ANALYTICS_ADMIN_PAGE_URL }) {
934
1117
  const t = _nextintl.useTranslations.call(void 0, );
935
1118
  const locale = _nextintl.useLocale.call(void 0, );
936
- const generateUrl = _chunkB4ZH2FOCjs.usePageUrlGenerator.call(void 0, );
1119
+ const generateUrl = _chunkIN2F6HI2js.usePageUrlGenerator.call(void 0, );
937
1120
  const [session, setSession] = _react.useState.call(void 0, void 0);
938
1121
  const [pageViews, setPageViews] = _react.useState.call(void 0, []);
939
1122
  const [otherSessions, setOtherSessions] = _react.useState.call(void 0, []);
@@ -989,26 +1172,26 @@ function AnalyticsJourneyContainer({ sessionId, pageUrl = ANALYTICS_ADMIN_PAGE_U
989
1172
  const title = { type: t("analytics.admin.panels.journey") };
990
1173
  const renderBody = /* @__PURE__ */ _chunk7QVYU63Ejs.__name.call(void 0, () => {
991
1174
  if (error) {
992
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.RoundPageContainer, { module: _chunkA7Y5YW7Qjs.Modules.AnalyticsSession, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-4", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.Card, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-destructive text-xs/relaxed", children: error }) }) }) }) });
1175
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.RoundPageContainer, { module: _chunkV7CHD7QTjs.Modules.AnalyticsSession, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "p-4", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.Card, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-destructive text-xs/relaxed", children: error }) }) }) }) });
993
1176
  }
994
- if (isLoading || !session) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.RoundPageContainer, { module: _chunkA7Y5YW7Qjs.Modules.AnalyticsSession, fullWidth: true, forceHeader: true });
1177
+ if (isLoading || !session) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.RoundPageContainer, { module: _chunkV7CHD7QTjs.Modules.AnalyticsSession, fullWidth: true, forceHeader: true });
995
1178
  const source = [_nullishCoalesce(session.utmSource, () => ( session.referrerHost)), session.utmMedium, session.utmCampaign].filter(Boolean).join(" / ");
996
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.RoundPageContainer, { module: _chunkA7Y5YW7Qjs.Modules.AnalyticsSession, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex w-full flex-col gap-4 p-4", children: [
997
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.Card, { "data-testid": "analytics-journey-attribution", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.CardContent, { className: "flex flex-col gap-3", children: [
1179
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.RoundPageContainer, { module: _chunkV7CHD7QTjs.Modules.AnalyticsSession, fullWidth: true, forceHeader: true, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex w-full flex-col gap-4 p-4", children: [
1180
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.Card, { "data-testid": "analytics-journey-attribution", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.CardContent, { className: "flex flex-col gap-3", children: [
998
1181
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-wrap items-center gap-2", children: [
999
1182
  session.user ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "flex flex-col", children: [
1000
1183
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-sm", children: session.user.name }),
1001
1184
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-muted-foreground text-xs", children: session.user.email })
1002
- ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.Badge, { variant: "softGray", children: t("analytics.admin.anonymous") }),
1003
- session.consented ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.Badge, { variant: "softGreen", children: t("analytics.admin.consented") }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.Badge, { variant: "softGray", children: t("analytics.admin.not_consented") })
1185
+ ] }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.Badge, { variant: "softGray", children: t("analytics.admin.anonymous") }),
1186
+ session.consented ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.Badge, { variant: "softGreen", children: t("analytics.admin.consented") }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.Badge, { variant: "softGray", children: t("analytics.admin.not_consented") })
1004
1187
  ] }),
1005
1188
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "grid gap-3 sm:grid-cols-3", children: [
1006
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.DetailField, { label: t("analytics.admin.columns.started"), value: dateTime.format(session.startedAt) }),
1007
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.DetailField, { label: t("analytics.admin.columns.source"), value: source }),
1008
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.DetailField, { label: t("analytics.admin.columns.landing"), value: session.landingRoute }),
1009
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.DetailField, { label: t("analytics.admin.columns.device"), value: session.deviceType }),
1189
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.DetailField, { label: t("analytics.admin.columns.started"), value: dateTime.format(session.startedAt) }),
1190
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.DetailField, { label: t("analytics.admin.columns.source"), value: source }),
1191
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.DetailField, { label: t("analytics.admin.columns.landing"), value: session.landingRoute }),
1192
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.DetailField, { label: t("analytics.admin.columns.device"), value: session.deviceType }),
1010
1193
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1011
- _chunkB4ZH2FOCjs.DetailField,
1194
+ _chunkIN2F6HI2js.DetailField,
1012
1195
  {
1013
1196
  label: t("analytics.admin.columns.visitor"),
1014
1197
  value: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "tabular-nums", children: session.visitorId })
@@ -1016,31 +1199,31 @@ function AnalyticsJourneyContainer({ sessionId, pageUrl = ANALYTICS_ADMIN_PAGE_U
1016
1199
  )
1017
1200
  ] })
1018
1201
  ] }) }),
1019
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.Card, { children: [
1020
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardTitle, { children: t("analytics.admin.columns.pages") }) }),
1021
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardContent, { children: pageViews.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm", children: t("analytics.admin.no_data") }) : (
1202
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.Card, { children: [
1203
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardTitle, { children: t("analytics.admin.columns.pages") }) }),
1204
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardContent, { children: pageViews.length === 0 ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-muted-foreground text-sm", children: t("analytics.admin.no_data") }) : (
1022
1205
  // The package's <Table> wraps itself in an `overflow-x-clip`
1023
1206
  // container — hence the child override, so wide rows scroll.
1024
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.Table, { children: [
1025
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHeader, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.TableRow, { children: [
1026
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.time") }),
1027
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.gap") }),
1028
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.path") })
1207
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "overflow-x-auto [&_[data-slot=table-container]]:overflow-x-visible", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.Table, { children: [
1208
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHeader, { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.TableRow, { children: [
1209
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.time") }),
1210
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-end text-xs font-medium", children: t("analytics.admin.columns.gap") }),
1211
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableHead, { className: "text-xs font-medium", children: t("analytics.admin.columns.path") })
1029
1212
  ] }) }),
1030
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableBody, { children: pageViews.map((pageView, index) => {
1213
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableBody, { children: pageViews.map((pageView, index) => {
1031
1214
  const previous = index > 0 ? pageViews[index - 1] : void 0;
1032
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.TableRow, { "data-testid": `analytics-pageview-row-${pageView.id}`, children: [
1033
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-xs tabular-nums", children: dateTime.format(pageView.createdAt) }),
1034
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-end text-xs tabular-nums", children: previous ? formatGap(pageView.createdAt.getTime() - previous.createdAt.getTime()) : "\u2014" }),
1035
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.TableCell, { className: "text-xs", children: pageView.path })
1215
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.TableRow, { "data-testid": `analytics-pageview-row-${pageView.id}`, children: [
1216
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-xs tabular-nums", children: dateTime.format(pageView.createdAt) }),
1217
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-end text-xs tabular-nums", children: previous ? formatGap(pageView.createdAt.getTime() - previous.createdAt.getTime()) : "\u2014" }),
1218
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.TableCell, { className: "text-xs", children: pageView.path })
1036
1219
  ] }, pageView.id);
1037
1220
  }) })
1038
1221
  ] }) })
1039
1222
  ) })
1040
1223
  ] }),
1041
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkB4ZH2FOCjs.Card, { children: [
1042
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardTitle, { children: t("analytics.admin.panels.other_sessions") }) }),
1043
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1224
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkIN2F6HI2js.Card, { children: [
1225
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardHeader, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardTitle, { children: t("analytics.admin.panels.other_sessions") }) }),
1226
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.CardContent, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1044
1227
  AnalyticsSessionsTable,
1045
1228
  {
1046
1229
  rows: otherSessions,
@@ -1052,7 +1235,7 @@ function AnalyticsJourneyContainer({ sessionId, pageUrl = ANALYTICS_ADMIN_PAGE_U
1052
1235
  ] })
1053
1236
  ] }) });
1054
1237
  }, "renderBody");
1055
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkB4ZH2FOCjs.SharedProvider, { value: { breadcrumbs: breadcrumb, title }, children: renderBody() });
1238
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkIN2F6HI2js.SharedProvider, { value: { breadcrumbs: breadcrumb, title }, children: renderBody() });
1056
1239
  }
1057
1240
  _chunk7QVYU63Ejs.__name.call(void 0, AnalyticsJourneyContainer, "AnalyticsJourneyContainer");
1058
1241
  function unit(locale, name, value) {
@@ -1102,6 +1285,8 @@ var ANALYTICS_ADMIN_I18N_KEYS = [
1102
1285
  "analytics.admin.panels.sessions",
1103
1286
  "analytics.admin.panels.journey",
1104
1287
  "analytics.admin.panels.other_sessions",
1288
+ "analytics.admin.panels.daily_visitors",
1289
+ "analytics.admin.panels.daily_users",
1105
1290
  // Breakdown tabs
1106
1291
  "analytics.admin.dimensions.source",
1107
1292
  "analytics.admin.dimensions.medium",
@@ -1132,7 +1317,12 @@ var ANALYTICS_ADMIN_I18N_KEYS = [
1132
1317
  "analytics.admin.other",
1133
1318
  // Timeline chart series
1134
1319
  "analytics.admin.series.visitors",
1135
- "analytics.admin.series.page_views"
1320
+ "analytics.admin.series.page_views",
1321
+ // Daily uniques charts
1322
+ "analytics.admin.daily_uniques.visitors",
1323
+ "analytics.admin.daily_uniques.users",
1324
+ "analytics.admin.daily_uniques.today",
1325
+ "analytics.admin.daily_uniques.no_data"
1136
1326
  ];
1137
1327
 
1138
1328
 
@@ -1160,5 +1350,7 @@ var ANALYTICS_ADMIN_I18N_KEYS = [
1160
1350
 
1161
1351
 
1162
1352
 
1163
- exports.ANALYTICS_ADMIN_I18N_KEYS = ANALYTICS_ADMIN_I18N_KEYS; exports.ANALYTICS_DIMENSIONS = ANALYTICS_DIMENSIONS; exports.ANALYTICS_GRANULARITIES = ANALYTICS_GRANULARITIES; exports.ANALYTICS_SECTIONS = ANALYTICS_SECTIONS; exports.AnalyticsAdminContainer = AnalyticsAdminContainer; exports.AnalyticsAdminFilterBar = AnalyticsAdminFilterBar; exports.AnalyticsAdminPageContainer = AnalyticsAdminPageContainer; exports.AnalyticsAdminProvider = AnalyticsAdminProvider; exports.AnalyticsAdminService = AnalyticsAdminService; exports.AnalyticsAdminTiles = AnalyticsAdminTiles; exports.AnalyticsBreakdown = _chunkOO2DBP6Ljs.AnalyticsBreakdown; exports.AnalyticsBreakdownTable = AnalyticsBreakdownTable; exports.AnalyticsEvent = _chunkOO2DBP6Ljs.AnalyticsEvent; exports.AnalyticsJourneyContainer = AnalyticsJourneyContainer; exports.AnalyticsJourneyPageContainer = AnalyticsJourneyPageContainer; exports.AnalyticsPageView = _chunkOO2DBP6Ljs.AnalyticsPageView; exports.AnalyticsService = AnalyticsService; exports.AnalyticsSession = _chunkOO2DBP6Ljs.AnalyticsSession; exports.AnalyticsSessionsTable = AnalyticsSessionsTable; exports.AnalyticsSummary = _chunkOO2DBP6Ljs.AnalyticsSummary; exports.AnalyticsTimeline = _chunkOO2DBP6Ljs.AnalyticsTimeline; exports.AnalyticsTimelineChart = AnalyticsTimelineChart; exports.AnalyticsTracker = AnalyticsTracker; exports.analyticsModules = _chunkOO2DBP6Ljs.analyticsModules; exports.useAnalyticsAdmin = useAnalyticsAdmin;
1353
+
1354
+
1355
+ exports.ANALYTICS_ADMIN_I18N_KEYS = ANALYTICS_ADMIN_I18N_KEYS; exports.ANALYTICS_DIMENSIONS = ANALYTICS_DIMENSIONS; exports.ANALYTICS_GRANULARITIES = ANALYTICS_GRANULARITIES; exports.ANALYTICS_SECTIONS = ANALYTICS_SECTIONS; exports.AnalyticsAdminContainer = AnalyticsAdminContainer; exports.AnalyticsAdminFilterBar = AnalyticsAdminFilterBar; exports.AnalyticsAdminPageContainer = AnalyticsAdminPageContainer; exports.AnalyticsAdminProvider = AnalyticsAdminProvider; exports.AnalyticsAdminService = AnalyticsAdminService; exports.AnalyticsAdminTiles = AnalyticsAdminTiles; exports.AnalyticsBreakdown = _chunkSGLFQ55Ujs.AnalyticsBreakdown; exports.AnalyticsBreakdownTable = AnalyticsBreakdownTable; exports.AnalyticsDailyUniqueTimeline = _chunkSGLFQ55Ujs.AnalyticsDailyUniqueTimeline; exports.AnalyticsDailyUniquesChart = AnalyticsDailyUniquesChart; exports.AnalyticsEvent = _chunkSGLFQ55Ujs.AnalyticsEvent; exports.AnalyticsJourneyContainer = AnalyticsJourneyContainer; exports.AnalyticsJourneyPageContainer = AnalyticsJourneyPageContainer; exports.AnalyticsPageView = _chunkSGLFQ55Ujs.AnalyticsPageView; exports.AnalyticsService = AnalyticsService; exports.AnalyticsSession = _chunkSGLFQ55Ujs.AnalyticsSession; exports.AnalyticsSessionsTable = AnalyticsSessionsTable; exports.AnalyticsSummary = _chunkSGLFQ55Ujs.AnalyticsSummary; exports.AnalyticsTimeline = _chunkSGLFQ55Ujs.AnalyticsTimeline; exports.AnalyticsTimelineChart = AnalyticsTimelineChart; exports.AnalyticsTracker = AnalyticsTracker; exports.analyticsModules = _chunkSGLFQ55Ujs.analyticsModules; exports.useAnalyticsAdmin = useAnalyticsAdmin;
1164
1356
  //# sourceMappingURL=index.js.map