@carlonicora/nextjs-jsonapi 6.19.0 → 6.20.1

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 (105) hide show
  1. package/dist/{BlockNoteEditor-5HSL74IX.mjs → BlockNoteEditor-S7EVHYWT.mjs} +5 -5
  2. package/dist/{BlockNoteEditor-6RZXGMSD.js → BlockNoteEditor-V76V5XFY.js} +20 -20
  3. package/dist/{BlockNoteEditor-6RZXGMSD.js.map → BlockNoteEditor-V76V5XFY.js.map} +1 -1
  4. package/dist/{BlockNoteViewer-X4UEVI2A.mjs → BlockNoteViewer-G3L46SGQ.mjs} +3 -3
  5. package/dist/{BlockNoteViewer-XYKFY77F.js → BlockNoteViewer-ZFJ3DZXN.js} +4 -4
  6. package/dist/{BlockNoteViewer-XYKFY77F.js.map → BlockNoteViewer-ZFJ3DZXN.js.map} +1 -1
  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-I5BQLY7V.js → chunk-2CR7HWVS.js} +9 -9
  12. package/dist/{chunk-I5BQLY7V.js.map → chunk-2CR7HWVS.js.map} +1 -1
  13. package/dist/{chunk-B4ZH2FOC.js → chunk-2CXF5XBU.js} +906 -906
  14. package/dist/{chunk-B4ZH2FOC.js.map → chunk-2CXF5XBU.js.map} +1 -1
  15. package/dist/{chunk-KMPBSOFB.mjs → chunk-4GB35M62.mjs} +50 -2
  16. package/dist/chunk-4GB35M62.mjs.map +1 -0
  17. package/dist/{chunk-OO2DBP6L.js → chunk-CMNJENSJ.js} +942 -894
  18. package/dist/chunk-CMNJENSJ.js.map +1 -0
  19. package/dist/{chunk-OKBJEIOP.mjs → chunk-JSHLBRFV.mjs} +35 -6
  20. package/dist/chunk-JSHLBRFV.mjs.map +1 -0
  21. package/dist/{chunk-TY5YWBLL.mjs → chunk-QSNZ6HPY.mjs} +3 -3
  22. package/dist/{chunk-HEDHJAKT.mjs → chunk-QWQZUFFA.mjs} +6 -6
  23. package/dist/{chunk-DFA566KY.js → chunk-SFDOUTEV.js} +4 -4
  24. package/dist/{chunk-DFA566KY.js.map → chunk-SFDOUTEV.js.map} +1 -1
  25. package/dist/{chunk-YVKWACDP.mjs → chunk-WU3UXTDS.mjs} +2 -2
  26. package/dist/{chunk-YVKWACDP.mjs.map → chunk-WU3UXTDS.mjs.map} +1 -1
  27. package/dist/{chunk-A7Y5YW7Q.js → chunk-YWLSIIE6.js} +47 -18
  28. package/dist/chunk-YWLSIIE6.js.map +1 -0
  29. package/dist/client/index.js +5 -5
  30. package/dist/client/index.mjs +4 -4
  31. package/dist/components/index.js +5 -5
  32. package/dist/components/index.mjs +4 -4
  33. package/dist/contexts/index.js +5 -5
  34. package/dist/contexts/index.mjs +4 -4
  35. package/dist/core/index.d.mts +2 -1
  36. package/dist/core/index.d.ts +2 -1
  37. package/dist/core/index.js +3 -3
  38. package/dist/core/index.mjs +2 -2
  39. package/dist/email-automations/index.js +118 -118
  40. package/dist/email-automations/index.mjs +4 -4
  41. package/dist/features/analytics/index.d.mts +60 -3
  42. package/dist/features/analytics/index.d.ts +60 -3
  43. package/dist/features/analytics/index.js +320 -128
  44. package/dist/features/analytics/index.js.map +1 -1
  45. package/dist/features/analytics/index.mjs +314 -122
  46. package/dist/features/analytics/index.mjs.map +1 -1
  47. package/dist/features/analytics/server.js +5 -5
  48. package/dist/features/analytics/server.mjs +3 -3
  49. package/dist/features/blog/index.js +151 -151
  50. package/dist/features/blog/index.mjs +4 -4
  51. package/dist/features/blog/server.js +17 -17
  52. package/dist/features/blog/server.mjs +2 -2
  53. package/dist/features/help/index.js +38 -38
  54. package/dist/features/help/index.mjs +4 -4
  55. package/dist/features/tokenusage/index.js +127 -127
  56. package/dist/features/tokenusage/index.mjs +4 -4
  57. package/dist/index.d.mts +1 -1
  58. package/dist/index.d.ts +1 -1
  59. package/dist/index.js +4 -4
  60. package/dist/index.mjs +3 -3
  61. package/dist/offline/index.d.mts +7 -3
  62. package/dist/offline/index.d.ts +7 -3
  63. package/dist/offline/index.js +77 -32
  64. package/dist/offline/index.js.map +1 -1
  65. package/dist/offline/index.mjs +65 -20
  66. package/dist/offline/index.mjs.map +1 -1
  67. package/dist/server/index.d.mts +4 -3
  68. package/dist/server/index.d.ts +4 -3
  69. package/dist/server/index.js +4 -4
  70. package/dist/server/index.mjs +3 -3
  71. package/messages/en.json +8 -0
  72. package/messages/it.json +8 -0
  73. package/package.json +1 -1
  74. package/pwa/sw.js +17 -1
  75. package/src/core/factories/RehydrationFactory.ts +47 -5
  76. package/src/core/factories/__tests__/RehydrationFactory.spec.ts +78 -0
  77. package/src/core/registry/ModuleRegistry.ts +1 -0
  78. package/src/features/analytics/analytics.modules.ts +6 -0
  79. package/src/features/analytics/components/AnalyticsAdminContainer.tsx +20 -0
  80. package/src/features/analytics/components/AnalyticsDailyUniquesChart.tsx +224 -0
  81. package/src/features/analytics/components/__tests__/AnalyticsDailyUniquesChart.spec.tsx +88 -0
  82. package/src/features/analytics/components/__tests__/AnalyticsPageContainers.spec.tsx +22 -0
  83. package/src/features/analytics/contexts/AnalyticsAdminContext.tsx +15 -2
  84. package/src/features/analytics/contexts/__tests__/AnalyticsAdminContext.spec.tsx +38 -0
  85. package/src/features/analytics/data/AnalyticsAdminService.ts +20 -0
  86. package/src/features/analytics/data/__tests__/AnalyticsAdminService.spec.ts +15 -0
  87. package/src/features/analytics/data/__tests__/models.spec.ts +29 -0
  88. package/src/features/analytics/data/analytics-daily-unique-timeline.interface.ts +11 -0
  89. package/src/features/analytics/data/analytics-daily-unique-timeline.ts +53 -0
  90. package/src/features/analytics/data/analytics.types.ts +10 -0
  91. package/src/features/analytics/data/index.ts +2 -0
  92. package/src/features/analytics/i18n-keys.ts +8 -0
  93. package/src/features/analytics/index.ts +1 -0
  94. package/src/offline/server/build-offline-manifest.ts +4 -3
  95. package/src/offline/sync/__tests__/sync-root.spec.ts +88 -8
  96. package/src/offline/sync/sync-root.ts +79 -23
  97. package/src/pwa/__tests__/sw.spec.ts +33 -3
  98. package/dist/chunk-A7Y5YW7Q.js.map +0 -1
  99. package/dist/chunk-KMPBSOFB.mjs.map +0 -1
  100. package/dist/chunk-OKBJEIOP.mjs.map +0 -1
  101. package/dist/chunk-OO2DBP6L.js.map +0 -1
  102. /package/dist/{BlockNoteEditor-5HSL74IX.mjs.map → BlockNoteEditor-S7EVHYWT.mjs.map} +0 -0
  103. /package/dist/{BlockNoteViewer-X4UEVI2A.mjs.map → BlockNoteViewer-G3L46SGQ.mjs.map} +0 -0
  104. /package/dist/{chunk-TY5YWBLL.mjs.map → chunk-QSNZ6HPY.mjs.map} +0 -0
  105. /package/dist/{chunk-HEDHJAKT.mjs.map → chunk-QWQZUFFA.mjs.map} +0 -0
@@ -45,9 +45,9 @@ import {
45
45
  useDebounce,
46
46
  usePageUrlGenerator,
47
47
  useSidebar
48
- } from "../chunk-HEDHJAKT.mjs";
48
+ } from "../chunk-QWQZUFFA.mjs";
49
49
  import "../chunk-VOXD3ZLY.mjs";
50
- import "../chunk-TY5YWBLL.mjs";
50
+ import "../chunk-QSNZ6HPY.mjs";
51
51
  import "../chunk-PW42LRSL.mjs";
52
52
  import {
53
53
  EmailAutomationEnrollmentService,
@@ -60,12 +60,12 @@ import {
60
60
  showError,
61
61
  showToast,
62
62
  useIsMobile
63
- } from "../chunk-KMPBSOFB.mjs";
63
+ } from "../chunk-4GB35M62.mjs";
64
64
  import "../chunk-OY65RYD3.mjs";
65
65
  import {
66
66
  Modules,
67
67
  useI18nRouter
68
- } from "../chunk-OKBJEIOP.mjs";
68
+ } from "../chunk-JSHLBRFV.mjs";
69
69
  import "../chunk-AUD6ZLBB.mjs";
70
70
  import "../chunk-M3N7LPHX.mjs";
71
71
  import "../chunk-4ZJIUTIV.mjs";
@@ -4,7 +4,7 @@ import { A as ApiDataInterface, J as JsonApiHydratedDataInterface } from '../../
4
4
  import { U as UserInterface } from '../../user.interface-Bm-0TbsB.mjs';
5
5
  import { A as AbstractApiData } from '../../AbstractApiData-CKy8tbde.mjs';
6
6
  import { A as AbstractService, N as NextRef } from '../../AbstractService-N0wFgaHD.mjs';
7
- export { a as analyticsModules } from '../../analytics.modules-txdCLNG-.mjs';
7
+ export { a as analyticsModules } from '../../analytics.modules-DEnXnRGt.mjs';
8
8
  import '../../stripe-price.interface-D6mKjAdr.mjs';
9
9
  import '../../ApiRequestDataTypeInterface-CYEcRUrh.mjs';
10
10
  import '../../types-Bq_UA8Lg.mjs';
@@ -31,6 +31,16 @@ interface AnalyticsBreakdownInterface extends ApiDataInterface {
31
31
  get pageViews(): number;
32
32
  }
33
33
 
34
+ /** One calendar day of the unique visitors / unique users charts. */
35
+ interface AnalyticsDailyUniqueTimelineInterface extends ApiDataInterface {
36
+ /** Backend declares this `type: "date"`, so it is a Date in memory. */
37
+ get day(): Date;
38
+ /** null = unknown for that day (drawn as a gap). */
39
+ get visitors(): number | null;
40
+ /** null = unknown for that day (drawn as a gap). */
41
+ get users(): number | null;
42
+ }
43
+
34
44
  interface AnalyticsSessionInterface extends ApiDataInterface {
35
45
  get visitorId(): string;
36
46
  get consented(): boolean;
@@ -119,6 +129,15 @@ type AnalyticsTimelineInput = {
119
129
  sessions: number;
120
130
  pageViews: number;
121
131
  };
132
+ type AnalyticsDailyUniqueTimelineInput = {
133
+ id: string;
134
+ /** Backend field type is "date" — emitted via formatLocalDate, never raw. */
135
+ day?: Date;
136
+ /** null = unknown for that day. */
137
+ visitors?: number | null;
138
+ /** null = unknown for that day. */
139
+ users?: number | null;
140
+ };
122
141
  type AnalyticsBreakdownInput = {
123
142
  id: string;
124
143
  dimension: string;
@@ -170,6 +189,8 @@ interface AnalyticsAdminContextType {
170
189
  timeline: AnalyticsTimelineInterface[];
171
190
  breakdowns: Record<AnalyticsDimension, AnalyticsBreakdownInterface[]>;
172
191
  sessions: AnalyticsSessionInterface[];
192
+ /** One row per day of the range: unique visitors and users, never filtered by section. */
193
+ dailyUniques: AnalyticsDailyUniqueTimelineInterface[];
173
194
  filters: AnalyticsAdminFilterState;
174
195
  /** Merges a partial patch into the current filters; every key is optional. */
175
196
  setFilters: (next: Partial<AnalyticsAdminFilterState>) => void;
@@ -275,6 +296,22 @@ type AnalyticsTimelineChartProps = {
275
296
  */
276
297
  declare function AnalyticsTimelineChart({ rows, className }: AnalyticsTimelineChartProps): React.JSX.Element;
277
298
 
299
+ type DailyUniquesMetric = "visitors" | "users";
300
+ type AnalyticsDailyUniquesChartProps = {
301
+ rows: AnalyticsDailyUniqueTimelineInterface[];
302
+ metric: DailyUniquesMetric;
303
+ className?: string;
304
+ };
305
+ /**
306
+ * Unique visitors or unique users per day, as a line.
307
+ *
308
+ * Always daily and never filtered by section: one row per day of the picked
309
+ * range, as the backend returns it. One series, so no legend — the card title
310
+ * names it. Colour does an identity job (the same metric keeps the same colour
311
+ * as in the "Over time" chart); the tooltip carries the value as text.
312
+ */
313
+ declare function AnalyticsDailyUniquesChart({ rows, metric, className }: AnalyticsDailyUniquesChartProps): React.JSX.Element;
314
+
278
315
  type Props$4 = {
279
316
  breakdowns: Record<AnalyticsDimension, AnalyticsBreakdownInterface[]>;
280
317
  };
@@ -402,6 +439,18 @@ declare class AnalyticsTimeline extends AbstractApiData implements AnalyticsTime
402
439
  createJsonApi(data: AnalyticsTimelineInput): any;
403
440
  }
404
441
 
442
+ /** One day of the daily unique visitors / users charts. A null count is an unknown day, never 0. */
443
+ declare class AnalyticsDailyUniqueTimeline extends AbstractApiData implements AnalyticsDailyUniqueTimelineInterface {
444
+ private _day;
445
+ private _visitors;
446
+ private _users;
447
+ get day(): Date;
448
+ get visitors(): number | null;
449
+ get users(): number | null;
450
+ rehydrate(data: JsonApiHydratedDataInterface): this;
451
+ createJsonApi(data: AnalyticsDailyUniqueTimelineInput): any;
452
+ }
453
+
405
454
  /** One row of a breakdown table: a key (source, route, …) and its counts. */
406
455
  declare class AnalyticsBreakdown extends AbstractApiData implements AnalyticsBreakdownInterface {
407
456
  private _dimension;
@@ -489,6 +538,14 @@ declare class AnalyticsAdminService extends AbstractService {
489
538
  static getTimeline(params: AnalyticsFilters & {
490
539
  granularity: AnalyticsGranularity;
491
540
  }): Promise<AnalyticsTimelineInterface[]>;
541
+ /**
542
+ * One row per calendar day from fromDate to toDate (YYYY-MM-DD, local dates).
543
+ * Always daily and never filtered by section, so it skips withFilters.
544
+ */
545
+ static getDailyUniques(params: {
546
+ fromDate: string;
547
+ toDate: string;
548
+ }): Promise<AnalyticsDailyUniqueTimelineInterface[]>;
492
549
  static getBreakdown(params: AnalyticsFilters & {
493
550
  dimension: AnalyticsDimension;
494
551
  limit?: number;
@@ -518,6 +575,6 @@ declare class AnalyticsAdminService extends AbstractService {
518
575
  * a component in this package, which is why the contract spec lists it among
519
576
  * the keys declared for app-rendered surfaces.
520
577
  */
521
- declare const ANALYTICS_ADMIN_I18N_KEYS: readonly ["analytics.admin.title", "analytics.admin.description", "analytics.admin.tiles.visitors", "analytics.admin.tiles.sessions", "analytics.admin.tiles.page_views", "analytics.admin.tiles.pages_per_session", "analytics.admin.tiles.consent_share", "analytics.admin.tiles.vs_previous", "analytics.admin.tiles.summarised_note", "analytics.admin.filter.section", "analytics.admin.filter.section_all", "analytics.admin.filter.section_public", "analytics.admin.filter.section_app", "analytics.admin.filter.granularity", "analytics.admin.filter.granularity_day", "analytics.admin.filter.granularity_week", "analytics.admin.filter.granularity_month", "analytics.admin.panels.over_time", "analytics.admin.panels.breakdown", "analytics.admin.panels.sessions", "analytics.admin.panels.journey", "analytics.admin.panels.other_sessions", "analytics.admin.dimensions.source", "analytics.admin.dimensions.medium", "analytics.admin.dimensions.campaign", "analytics.admin.dimensions.referrer", "analytics.admin.dimensions.route", "analytics.admin.dimensions.landing", "analytics.admin.columns.key", "analytics.admin.columns.visitors", "analytics.admin.columns.sessions", "analytics.admin.columns.page_views", "analytics.admin.columns.started", "analytics.admin.columns.visitor", "analytics.admin.columns.source", "analytics.admin.columns.landing", "analytics.admin.columns.pages", "analytics.admin.columns.device", "analytics.admin.columns.time", "analytics.admin.columns.gap", "analytics.admin.columns.path", "analytics.admin.anonymous", "analytics.admin.consented", "analytics.admin.not_consented", "analytics.admin.load_more", "analytics.admin.no_data", "analytics.admin.other", "analytics.admin.series.visitors", "analytics.admin.series.page_views"];
578
+ declare const ANALYTICS_ADMIN_I18N_KEYS: readonly ["analytics.admin.title", "analytics.admin.description", "analytics.admin.tiles.visitors", "analytics.admin.tiles.sessions", "analytics.admin.tiles.page_views", "analytics.admin.tiles.pages_per_session", "analytics.admin.tiles.consent_share", "analytics.admin.tiles.vs_previous", "analytics.admin.tiles.summarised_note", "analytics.admin.filter.section", "analytics.admin.filter.section_all", "analytics.admin.filter.section_public", "analytics.admin.filter.section_app", "analytics.admin.filter.granularity", "analytics.admin.filter.granularity_day", "analytics.admin.filter.granularity_week", "analytics.admin.filter.granularity_month", "analytics.admin.panels.over_time", "analytics.admin.panels.breakdown", "analytics.admin.panels.sessions", "analytics.admin.panels.journey", "analytics.admin.panels.other_sessions", "analytics.admin.panels.daily_visitors", "analytics.admin.panels.daily_users", "analytics.admin.dimensions.source", "analytics.admin.dimensions.medium", "analytics.admin.dimensions.campaign", "analytics.admin.dimensions.referrer", "analytics.admin.dimensions.route", "analytics.admin.dimensions.landing", "analytics.admin.columns.key", "analytics.admin.columns.visitors", "analytics.admin.columns.sessions", "analytics.admin.columns.page_views", "analytics.admin.columns.started", "analytics.admin.columns.visitor", "analytics.admin.columns.source", "analytics.admin.columns.landing", "analytics.admin.columns.pages", "analytics.admin.columns.device", "analytics.admin.columns.time", "analytics.admin.columns.gap", "analytics.admin.columns.path", "analytics.admin.anonymous", "analytics.admin.consented", "analytics.admin.not_consented", "analytics.admin.load_more", "analytics.admin.no_data", "analytics.admin.other", "analytics.admin.series.visitors", "analytics.admin.series.page_views", "analytics.admin.daily_uniques.visitors", "analytics.admin.daily_uniques.users", "analytics.admin.daily_uniques.today", "analytics.admin.daily_uniques.no_data"];
522
579
 
523
- export { ANALYTICS_ADMIN_I18N_KEYS, ANALYTICS_DIMENSIONS, ANALYTICS_GRANULARITIES, ANALYTICS_SECTIONS, AnalyticsAdminContainer, type AnalyticsAdminContextType, AnalyticsAdminFilterBar, type AnalyticsAdminFilterState, AnalyticsAdminPageContainer, AnalyticsAdminProvider, AnalyticsAdminService, AnalyticsAdminTiles, AnalyticsBreakdown, type AnalyticsBreakdownInput, type AnalyticsBreakdownInterface, AnalyticsBreakdownTable, type AnalyticsDimension, AnalyticsEvent, type AnalyticsEventInput, type AnalyticsEventInterface, type AnalyticsFilters, type AnalyticsGranularity, AnalyticsJourneyContainer, AnalyticsJourneyPageContainer, AnalyticsPageView, type AnalyticsPageViewInput, type AnalyticsPageViewInterface, type AnalyticsSection, AnalyticsService, AnalyticsSession, type AnalyticsSessionInput, type AnalyticsSessionInterface, AnalyticsSessionsTable, AnalyticsSummary, type AnalyticsSummaryInput, type AnalyticsSummaryInterface, AnalyticsTimeline, AnalyticsTimelineChart, type AnalyticsTimelineInput, type AnalyticsTimelineInterface, AnalyticsTracker, useAnalyticsAdmin };
580
+ export { ANALYTICS_ADMIN_I18N_KEYS, ANALYTICS_DIMENSIONS, ANALYTICS_GRANULARITIES, ANALYTICS_SECTIONS, AnalyticsAdminContainer, type AnalyticsAdminContextType, AnalyticsAdminFilterBar, type AnalyticsAdminFilterState, AnalyticsAdminPageContainer, AnalyticsAdminProvider, AnalyticsAdminService, AnalyticsAdminTiles, AnalyticsBreakdown, type AnalyticsBreakdownInput, type AnalyticsBreakdownInterface, AnalyticsBreakdownTable, AnalyticsDailyUniqueTimeline, type AnalyticsDailyUniqueTimelineInput, type AnalyticsDailyUniqueTimelineInterface, AnalyticsDailyUniquesChart, type AnalyticsDimension, AnalyticsEvent, type AnalyticsEventInput, type AnalyticsEventInterface, type AnalyticsFilters, type AnalyticsGranularity, AnalyticsJourneyContainer, AnalyticsJourneyPageContainer, AnalyticsPageView, type AnalyticsPageViewInput, type AnalyticsPageViewInterface, type AnalyticsSection, AnalyticsService, AnalyticsSession, type AnalyticsSessionInput, type AnalyticsSessionInterface, AnalyticsSessionsTable, AnalyticsSummary, type AnalyticsSummaryInput, type AnalyticsSummaryInterface, AnalyticsTimeline, AnalyticsTimelineChart, type AnalyticsTimelineInput, type AnalyticsTimelineInterface, AnalyticsTracker, useAnalyticsAdmin };
@@ -4,7 +4,7 @@ import { A as ApiDataInterface, J as JsonApiHydratedDataInterface } from '../../
4
4
  import { U as UserInterface } from '../../user.interface-CKBIEvNu.js';
5
5
  import { A as AbstractApiData } from '../../AbstractApiData-rgvs0cdY.js';
6
6
  import { A as AbstractService, N as NextRef } from '../../AbstractService-kNAykPDk.js';
7
- export { a as analyticsModules } from '../../analytics.modules-Bsacu6ik.js';
7
+ export { a as analyticsModules } from '../../analytics.modules-C4OT7fVa.js';
8
8
  import '../../stripe-price.interface-DGqcklFJ.js';
9
9
  import '../../ApiRequestDataTypeInterface-CYEcRUrh.js';
10
10
  import '../../types-bsm8Fp55.js';
@@ -31,6 +31,16 @@ interface AnalyticsBreakdownInterface extends ApiDataInterface {
31
31
  get pageViews(): number;
32
32
  }
33
33
 
34
+ /** One calendar day of the unique visitors / unique users charts. */
35
+ interface AnalyticsDailyUniqueTimelineInterface extends ApiDataInterface {
36
+ /** Backend declares this `type: "date"`, so it is a Date in memory. */
37
+ get day(): Date;
38
+ /** null = unknown for that day (drawn as a gap). */
39
+ get visitors(): number | null;
40
+ /** null = unknown for that day (drawn as a gap). */
41
+ get users(): number | null;
42
+ }
43
+
34
44
  interface AnalyticsSessionInterface extends ApiDataInterface {
35
45
  get visitorId(): string;
36
46
  get consented(): boolean;
@@ -119,6 +129,15 @@ type AnalyticsTimelineInput = {
119
129
  sessions: number;
120
130
  pageViews: number;
121
131
  };
132
+ type AnalyticsDailyUniqueTimelineInput = {
133
+ id: string;
134
+ /** Backend field type is "date" — emitted via formatLocalDate, never raw. */
135
+ day?: Date;
136
+ /** null = unknown for that day. */
137
+ visitors?: number | null;
138
+ /** null = unknown for that day. */
139
+ users?: number | null;
140
+ };
122
141
  type AnalyticsBreakdownInput = {
123
142
  id: string;
124
143
  dimension: string;
@@ -170,6 +189,8 @@ interface AnalyticsAdminContextType {
170
189
  timeline: AnalyticsTimelineInterface[];
171
190
  breakdowns: Record<AnalyticsDimension, AnalyticsBreakdownInterface[]>;
172
191
  sessions: AnalyticsSessionInterface[];
192
+ /** One row per day of the range: unique visitors and users, never filtered by section. */
193
+ dailyUniques: AnalyticsDailyUniqueTimelineInterface[];
173
194
  filters: AnalyticsAdminFilterState;
174
195
  /** Merges a partial patch into the current filters; every key is optional. */
175
196
  setFilters: (next: Partial<AnalyticsAdminFilterState>) => void;
@@ -275,6 +296,22 @@ type AnalyticsTimelineChartProps = {
275
296
  */
276
297
  declare function AnalyticsTimelineChart({ rows, className }: AnalyticsTimelineChartProps): React.JSX.Element;
277
298
 
299
+ type DailyUniquesMetric = "visitors" | "users";
300
+ type AnalyticsDailyUniquesChartProps = {
301
+ rows: AnalyticsDailyUniqueTimelineInterface[];
302
+ metric: DailyUniquesMetric;
303
+ className?: string;
304
+ };
305
+ /**
306
+ * Unique visitors or unique users per day, as a line.
307
+ *
308
+ * Always daily and never filtered by section: one row per day of the picked
309
+ * range, as the backend returns it. One series, so no legend — the card title
310
+ * names it. Colour does an identity job (the same metric keeps the same colour
311
+ * as in the "Over time" chart); the tooltip carries the value as text.
312
+ */
313
+ declare function AnalyticsDailyUniquesChart({ rows, metric, className }: AnalyticsDailyUniquesChartProps): React.JSX.Element;
314
+
278
315
  type Props$4 = {
279
316
  breakdowns: Record<AnalyticsDimension, AnalyticsBreakdownInterface[]>;
280
317
  };
@@ -402,6 +439,18 @@ declare class AnalyticsTimeline extends AbstractApiData implements AnalyticsTime
402
439
  createJsonApi(data: AnalyticsTimelineInput): any;
403
440
  }
404
441
 
442
+ /** One day of the daily unique visitors / users charts. A null count is an unknown day, never 0. */
443
+ declare class AnalyticsDailyUniqueTimeline extends AbstractApiData implements AnalyticsDailyUniqueTimelineInterface {
444
+ private _day;
445
+ private _visitors;
446
+ private _users;
447
+ get day(): Date;
448
+ get visitors(): number | null;
449
+ get users(): number | null;
450
+ rehydrate(data: JsonApiHydratedDataInterface): this;
451
+ createJsonApi(data: AnalyticsDailyUniqueTimelineInput): any;
452
+ }
453
+
405
454
  /** One row of a breakdown table: a key (source, route, …) and its counts. */
406
455
  declare class AnalyticsBreakdown extends AbstractApiData implements AnalyticsBreakdownInterface {
407
456
  private _dimension;
@@ -489,6 +538,14 @@ declare class AnalyticsAdminService extends AbstractService {
489
538
  static getTimeline(params: AnalyticsFilters & {
490
539
  granularity: AnalyticsGranularity;
491
540
  }): Promise<AnalyticsTimelineInterface[]>;
541
+ /**
542
+ * One row per calendar day from fromDate to toDate (YYYY-MM-DD, local dates).
543
+ * Always daily and never filtered by section, so it skips withFilters.
544
+ */
545
+ static getDailyUniques(params: {
546
+ fromDate: string;
547
+ toDate: string;
548
+ }): Promise<AnalyticsDailyUniqueTimelineInterface[]>;
492
549
  static getBreakdown(params: AnalyticsFilters & {
493
550
  dimension: AnalyticsDimension;
494
551
  limit?: number;
@@ -518,6 +575,6 @@ declare class AnalyticsAdminService extends AbstractService {
518
575
  * a component in this package, which is why the contract spec lists it among
519
576
  * the keys declared for app-rendered surfaces.
520
577
  */
521
- declare const ANALYTICS_ADMIN_I18N_KEYS: readonly ["analytics.admin.title", "analytics.admin.description", "analytics.admin.tiles.visitors", "analytics.admin.tiles.sessions", "analytics.admin.tiles.page_views", "analytics.admin.tiles.pages_per_session", "analytics.admin.tiles.consent_share", "analytics.admin.tiles.vs_previous", "analytics.admin.tiles.summarised_note", "analytics.admin.filter.section", "analytics.admin.filter.section_all", "analytics.admin.filter.section_public", "analytics.admin.filter.section_app", "analytics.admin.filter.granularity", "analytics.admin.filter.granularity_day", "analytics.admin.filter.granularity_week", "analytics.admin.filter.granularity_month", "analytics.admin.panels.over_time", "analytics.admin.panels.breakdown", "analytics.admin.panels.sessions", "analytics.admin.panels.journey", "analytics.admin.panels.other_sessions", "analytics.admin.dimensions.source", "analytics.admin.dimensions.medium", "analytics.admin.dimensions.campaign", "analytics.admin.dimensions.referrer", "analytics.admin.dimensions.route", "analytics.admin.dimensions.landing", "analytics.admin.columns.key", "analytics.admin.columns.visitors", "analytics.admin.columns.sessions", "analytics.admin.columns.page_views", "analytics.admin.columns.started", "analytics.admin.columns.visitor", "analytics.admin.columns.source", "analytics.admin.columns.landing", "analytics.admin.columns.pages", "analytics.admin.columns.device", "analytics.admin.columns.time", "analytics.admin.columns.gap", "analytics.admin.columns.path", "analytics.admin.anonymous", "analytics.admin.consented", "analytics.admin.not_consented", "analytics.admin.load_more", "analytics.admin.no_data", "analytics.admin.other", "analytics.admin.series.visitors", "analytics.admin.series.page_views"];
578
+ declare const ANALYTICS_ADMIN_I18N_KEYS: readonly ["analytics.admin.title", "analytics.admin.description", "analytics.admin.tiles.visitors", "analytics.admin.tiles.sessions", "analytics.admin.tiles.page_views", "analytics.admin.tiles.pages_per_session", "analytics.admin.tiles.consent_share", "analytics.admin.tiles.vs_previous", "analytics.admin.tiles.summarised_note", "analytics.admin.filter.section", "analytics.admin.filter.section_all", "analytics.admin.filter.section_public", "analytics.admin.filter.section_app", "analytics.admin.filter.granularity", "analytics.admin.filter.granularity_day", "analytics.admin.filter.granularity_week", "analytics.admin.filter.granularity_month", "analytics.admin.panels.over_time", "analytics.admin.panels.breakdown", "analytics.admin.panels.sessions", "analytics.admin.panels.journey", "analytics.admin.panels.other_sessions", "analytics.admin.panels.daily_visitors", "analytics.admin.panels.daily_users", "analytics.admin.dimensions.source", "analytics.admin.dimensions.medium", "analytics.admin.dimensions.campaign", "analytics.admin.dimensions.referrer", "analytics.admin.dimensions.route", "analytics.admin.dimensions.landing", "analytics.admin.columns.key", "analytics.admin.columns.visitors", "analytics.admin.columns.sessions", "analytics.admin.columns.page_views", "analytics.admin.columns.started", "analytics.admin.columns.visitor", "analytics.admin.columns.source", "analytics.admin.columns.landing", "analytics.admin.columns.pages", "analytics.admin.columns.device", "analytics.admin.columns.time", "analytics.admin.columns.gap", "analytics.admin.columns.path", "analytics.admin.anonymous", "analytics.admin.consented", "analytics.admin.not_consented", "analytics.admin.load_more", "analytics.admin.no_data", "analytics.admin.other", "analytics.admin.series.visitors", "analytics.admin.series.page_views", "analytics.admin.daily_uniques.visitors", "analytics.admin.daily_uniques.users", "analytics.admin.daily_uniques.today", "analytics.admin.daily_uniques.no_data"];
522
579
 
523
- export { ANALYTICS_ADMIN_I18N_KEYS, ANALYTICS_DIMENSIONS, ANALYTICS_GRANULARITIES, ANALYTICS_SECTIONS, AnalyticsAdminContainer, type AnalyticsAdminContextType, AnalyticsAdminFilterBar, type AnalyticsAdminFilterState, AnalyticsAdminPageContainer, AnalyticsAdminProvider, AnalyticsAdminService, AnalyticsAdminTiles, AnalyticsBreakdown, type AnalyticsBreakdownInput, type AnalyticsBreakdownInterface, AnalyticsBreakdownTable, type AnalyticsDimension, AnalyticsEvent, type AnalyticsEventInput, type AnalyticsEventInterface, type AnalyticsFilters, type AnalyticsGranularity, AnalyticsJourneyContainer, AnalyticsJourneyPageContainer, AnalyticsPageView, type AnalyticsPageViewInput, type AnalyticsPageViewInterface, type AnalyticsSection, AnalyticsService, AnalyticsSession, type AnalyticsSessionInput, type AnalyticsSessionInterface, AnalyticsSessionsTable, AnalyticsSummary, type AnalyticsSummaryInput, type AnalyticsSummaryInterface, AnalyticsTimeline, AnalyticsTimelineChart, type AnalyticsTimelineInput, type AnalyticsTimelineInterface, AnalyticsTracker, useAnalyticsAdmin };
580
+ export { ANALYTICS_ADMIN_I18N_KEYS, ANALYTICS_DIMENSIONS, ANALYTICS_GRANULARITIES, ANALYTICS_SECTIONS, AnalyticsAdminContainer, type AnalyticsAdminContextType, AnalyticsAdminFilterBar, type AnalyticsAdminFilterState, AnalyticsAdminPageContainer, AnalyticsAdminProvider, AnalyticsAdminService, AnalyticsAdminTiles, AnalyticsBreakdown, type AnalyticsBreakdownInput, type AnalyticsBreakdownInterface, AnalyticsBreakdownTable, AnalyticsDailyUniqueTimeline, type AnalyticsDailyUniqueTimelineInput, type AnalyticsDailyUniqueTimelineInterface, AnalyticsDailyUniquesChart, type AnalyticsDimension, AnalyticsEvent, type AnalyticsEventInput, type AnalyticsEventInterface, type AnalyticsFilters, type AnalyticsGranularity, AnalyticsJourneyContainer, AnalyticsJourneyPageContainer, AnalyticsPageView, type AnalyticsPageViewInput, type AnalyticsPageViewInterface, type AnalyticsSection, AnalyticsService, AnalyticsSession, type AnalyticsSessionInput, type AnalyticsSessionInterface, AnalyticsSessionsTable, AnalyticsSummary, type AnalyticsSummaryInput, type AnalyticsSummaryInterface, AnalyticsTimeline, AnalyticsTimelineChart, type AnalyticsTimelineInput, type AnalyticsTimelineInterface, AnalyticsTracker, useAnalyticsAdmin };