@burdenoff/microfe-timecampus 2026.903.1 → 2026.904.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.
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage.d.ts","sourceRoot":"","sources":["../../../src/timecampus/pages/HomePage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AA8BhC,eAAO,MAAM,QAAQ,EAAE,EA2YtB,CAAC"}
1
+ {"version":3,"file":"HomePage.d.ts","sourceRoot":"","sources":["../../../src/timecampus/pages/HomePage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AA8BhC,eAAO,MAAM,QAAQ,EAAE,EAyatB,CAAC"}
@@ -7,270 +7,275 @@ import { useGetTimeEntryStatsQuery as o, useListTimeEntriesQuery as s } from "..
7
7
  import { useTr as c } from "../shared/hooks/useTr.js";
8
8
  import "../hooks/index.js";
9
9
  import { ArrowRight as l, BarChart3 as u, CheckCircle as d, Clock as f, FolderOpen as p, Play as m, TrendingUp as h, Users as g } from "lucide-react";
10
- import { jsx as _, jsxs as v } from "react/jsx-runtime";
11
- import { AuroraBackground as y, CTAOverflowMenu as b, EmphasisPanel as x, GlassCard as S, GradientText as C } from "@burdenoff/fe-libs/ui";
10
+ import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
11
+ import { AuroraBackground as b, CTAOverflowMenu as x, EmphasisPanel as S, GlassCard as C, GradientText as w } from "@burdenoff/fe-libs/ui";
12
12
  //#region src/timecampus/pages/HomePage.tsx
13
- var w = () => {
14
- let w = c(), T = e(), { data: E, loading: D } = o(), { data: O, loading: k } = s({ variables: { pagination: { limit: 4 } } }), A = E?.timeEntryStats, j = O?.timeEntries?.items ?? [], M = !D && !k && (A?.totalEntries ?? 0) === 0, N = /* @__PURE__ */ _(b, {
13
+ var T = () => {
14
+ let T = c(), E = e(), { data: D, loading: O } = o(), { data: k, loading: A } = s({ variables: { pagination: { limit: 4 } } }), j = D?.timeEntryStats, M = k?.timeEntries?.items ?? [], N = !O && !A && (j?.totalEntries ?? 0) === 0, P = /* @__PURE__ */ v(x, {
15
15
  primary: {
16
- label: w("timecampus.home.actions.startTimer", "Start Timer"),
17
- onSelect: () => T("/time/timer"),
18
- icon: /* @__PURE__ */ _(m, { className: "h-4 w-4" })
16
+ label: T("timecampus.home.actions.startTimer", "Start Timer"),
17
+ onSelect: () => E("/time/timer"),
18
+ icon: /* @__PURE__ */ v(m, { className: "h-4 w-4" })
19
19
  },
20
20
  actions: [{
21
- label: w("timecampus.home.quickActions.viewProjects.label", "View Projects"),
22
- onSelect: () => T("/projects"),
23
- icon: /* @__PURE__ */ _(p, { className: "h-4 w-4" })
21
+ label: T("timecampus.home.quickActions.viewProjects.label", "View Projects"),
22
+ onSelect: () => E("/projects"),
23
+ icon: /* @__PURE__ */ v(p, { className: "h-4 w-4" })
24
24
  }, {
25
- label: w("timecampus.home.quickActions.reports.label", "Reports"),
26
- onSelect: () => T("/reports"),
27
- icon: /* @__PURE__ */ _(u, { className: "h-4 w-4" })
25
+ label: T("timecampus.home.quickActions.reports.label", "Reports"),
26
+ onSelect: () => E("/reports"),
27
+ icon: /* @__PURE__ */ v(u, { className: "h-4 w-4" })
28
28
  }]
29
- }), P = () => /* @__PURE__ */ v("div", {
29
+ }), F = () => /* @__PURE__ */ y("div", {
30
30
  className: "relative overflow-hidden rounded-2xl border border-border-seam bg-gloss-card p-5 sm:p-6",
31
- children: [/* @__PURE__ */ _(y, { intensity: "subtle" }), /* @__PURE__ */ v("div", {
31
+ children: [/* @__PURE__ */ v(b, { intensity: "subtle" }), /* @__PURE__ */ y("div", {
32
32
  className: "relative flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
33
- children: [/* @__PURE__ */ v("div", {
33
+ children: [/* @__PURE__ */ y("div", {
34
34
  className: "min-w-0",
35
- children: [/* @__PURE__ */ _("h1", {
35
+ children: [/* @__PURE__ */ v("h1", {
36
36
  className: "text-2xl font-bold text-text-primary",
37
- children: /* @__PURE__ */ _(C, { children: w("timecampus.home.title", "Dashboard") })
38
- }), /* @__PURE__ */ _("p", {
37
+ children: /* @__PURE__ */ v(w, { children: T("timecampus.home.title", "Dashboard") })
38
+ }), /* @__PURE__ */ v("p", {
39
39
  className: "mt-1 text-sm text-text-secondary",
40
- children: w("timecampus.home.description", "Overview of your time tracking and productivity")
40
+ children: T("timecampus.home.description", "Overview of your time tracking and productivity")
41
41
  })]
42
- }), N]
42
+ }), P]
43
43
  })]
44
44
  });
45
- return D && k ? /* @__PURE__ */ v("div", {
45
+ return O && A ? /* @__PURE__ */ y("div", {
46
46
  className: "min-h-full space-y-6 p-4 sm:p-6",
47
- children: [P(), /* @__PURE__ */ _(i, {
47
+ children: [F(), /* @__PURE__ */ v(i, {
48
48
  variant: "card",
49
49
  count: 4
50
50
  })]
51
- }) : /* @__PURE__ */ v("div", {
51
+ }) : /* @__PURE__ */ y("div", {
52
52
  className: "min-h-full space-y-6 p-4 sm:p-6",
53
53
  children: [
54
- P(),
55
- M ? /* @__PURE__ */ _(a, {
56
- illustration: "empty-data",
57
- title: w("timecampus.home.gettingStarted.title", "Let's get you started"),
58
- description: w("timecampus.home.gettingStarted.description", "TimeCampus tracks your time when you start a timer — stop it when you're done, and everything else (your Timeline, Focus Score, and Reports) fills in automatically from what you track. No extra setup needed."),
59
- action: /* @__PURE__ */ v("button", {
60
- type: "button",
61
- onClick: () => T("/time/timer"),
62
- className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
63
- children: [/* @__PURE__ */ _(m, { className: "h-4 w-4" }), w("timecampus.home.gettingStarted.action", "Start your first timer")]
64
- })
65
- }) : /* @__PURE__ */ v("div", {
54
+ F(),
55
+ N ? /* @__PURE__ */ y("div", {
56
+ className: "flex flex-col items-center gap-3",
57
+ children: [/* @__PURE__ */ v(a, {
58
+ illustration: "empty-data",
59
+ title: T("timecampus.home.gettingStarted.title", "Let's get you started"),
60
+ description: T("timecampus.home.gettingStarted.description", "TimeCampus tracks your time when you start a timer — stop it when you're done, and everything else (your Timeline, Focus Score, and Reports) fills in automatically from what you track. No extra setup needed."),
61
+ action: /* @__PURE__ */ y("button", {
62
+ type: "button",
63
+ onClick: () => E("/time/timer"),
64
+ className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
65
+ children: [/* @__PURE__ */ v(m, { className: "h-4 w-4" }), T("timecampus.home.gettingStarted.action", "Start your first timer")]
66
+ })
67
+ }), /* @__PURE__ */ v("p", {
68
+ className: "max-w-md text-center text-xs text-text-secondary",
69
+ children: T("timecampus.home.gettingStarted.footnote", "That's the only thing to set up. Pomodoro, Life tracking, reports and everything else in the sidebar are there whenever you're curious — nothing else needs configuring first.")
70
+ })]
71
+ }) : /* @__PURE__ */ y("div", {
66
72
  className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",
67
73
  children: [
68
- /* @__PURE__ */ _(r, {
74
+ /* @__PURE__ */ v(r, {
69
75
  featured: !0,
70
- title: w("timecampus.home.stats.today", "Today"),
71
- value: n(A?.totalHours ?? 0),
72
- icon: /* @__PURE__ */ _(f, { className: "h-5 w-5" }),
76
+ title: T("timecampus.home.stats.today", "Today"),
77
+ value: n(j?.totalHours ?? 0),
78
+ icon: /* @__PURE__ */ v(f, { className: "h-5 w-5" }),
73
79
  trend: {
74
80
  value: 12.5,
75
- label: w("timecampus.home.stats.vsYesterday", "vs yesterday")
81
+ label: T("timecampus.home.stats.vsYesterday", "vs yesterday")
76
82
  }
77
83
  }),
78
- /* @__PURE__ */ _(r, {
79
- title: w("timecampus.home.stats.billable", "Billable"),
80
- value: n(A?.billableHours ?? 0),
81
- icon: /* @__PURE__ */ _(h, { className: "h-5 w-5" }),
82
- description: `${A?.totalEntries ?? 0} ${w("timecampus.home.stats.entries", "entries")}`
84
+ /* @__PURE__ */ v(r, {
85
+ title: T("timecampus.home.stats.billable", "Billable"),
86
+ value: n(j?.billableHours ?? 0),
87
+ icon: /* @__PURE__ */ v(h, { className: "h-5 w-5" }),
88
+ description: `${j?.totalEntries ?? 0} ${T("timecampus.home.stats.entries", "entries")}`
83
89
  }),
84
- /* @__PURE__ */ _(r, {
85
- title: w("timecampus.home.stats.activeTimers", "Active Timers"),
86
- value: A?.activeTimers ?? 0,
87
- icon: /* @__PURE__ */ _(p, { className: "h-5 w-5" }),
88
- description: w("timecampus.home.stats.currentlyRunning", "Currently running")
90
+ /* @__PURE__ */ v(r, {
91
+ title: T("timecampus.home.stats.activeTimers", "Active Timers"),
92
+ value: j?.activeTimers ?? 0,
93
+ icon: /* @__PURE__ */ v(p, { className: "h-5 w-5" }),
94
+ description: T("timecampus.home.stats.currentlyRunning", "Currently running")
89
95
  }),
90
- /* @__PURE__ */ _(r, {
91
- title: w("timecampus.home.stats.totalEntries", "Entries"),
92
- value: A?.totalEntries ?? 0,
93
- icon: /* @__PURE__ */ _(u, { className: "h-5 w-5" }),
94
- description: w("timecampus.home.stats.totalEntriesDescription", "Total time entries")
96
+ /* @__PURE__ */ v(r, {
97
+ title: T("timecampus.home.stats.totalEntries", "Entries"),
98
+ value: j?.totalEntries ?? 0,
99
+ icon: /* @__PURE__ */ v(u, { className: "h-5 w-5" }),
100
+ description: T("timecampus.home.stats.totalEntriesDescription", "Total time entries")
95
101
  })
96
102
  ]
97
103
  }),
98
- /* @__PURE__ */ v("div", {
104
+ !N && /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ y("div", {
99
105
  className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
100
- children: [/* @__PURE__ */ v(S, {
106
+ children: [/* @__PURE__ */ y(C, {
101
107
  treatment: "plain",
102
108
  className: "border-border-seam p-6 lg:col-span-2",
103
- children: [/* @__PURE__ */ v("div", {
109
+ children: [/* @__PURE__ */ y("div", {
104
110
  className: "mb-4 flex items-center justify-between",
105
- children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("h3", {
111
+ children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("h3", {
106
112
  className: "text-sm font-semibold text-text-primary",
107
- children: w("timecampus.home.recentEntries.title", "Recent Time Entries")
108
- }), /* @__PURE__ */ _("p", {
113
+ children: T("timecampus.home.recentEntries.title", "Recent Time Entries")
114
+ }), /* @__PURE__ */ v("p", {
109
115
  className: "text-xs text-text-secondary",
110
- children: w("timecampus.home.recentEntries.description", "Your latest tracked activities")
111
- })] }), /* @__PURE__ */ v("button", {
112
- onClick: () => T("/time/entries"),
116
+ children: T("timecampus.home.recentEntries.description", "Your latest tracked activities")
117
+ })] }), /* @__PURE__ */ y("button", {
118
+ onClick: () => E("/time/entries"),
113
119
  className: "inline-flex min-h-[2.75rem] items-center gap-1 rounded-md px-2 text-xs font-medium text-primary transition-colors hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border",
114
120
  children: [
115
- w("timecampus.home.recentEntries.viewAll", "View all"),
121
+ T("timecampus.home.recentEntries.viewAll", "View all"),
116
122
  " ",
117
- /* @__PURE__ */ _(l, { className: "h-3 w-3" })
123
+ /* @__PURE__ */ v(l, { className: "h-3 w-3" })
118
124
  ]
119
125
  })]
120
- }), k ? /* @__PURE__ */ _(i, {
126
+ }), A ? /* @__PURE__ */ v(i, {
121
127
  variant: "list",
122
128
  count: 4
123
- }) : /* @__PURE__ */ v("div", {
129
+ }) : /* @__PURE__ */ y("div", {
124
130
  className: "flex flex-col gap-3",
125
- children: [j.map((e) => /* @__PURE__ */ v("div", {
131
+ children: [M.map((e) => /* @__PURE__ */ y("div", {
126
132
  className: "flex items-center justify-between rounded-lg border border-border-seam p-3 transition-colors hover:bg-bg-sunken/50",
127
- children: [/* @__PURE__ */ v("div", {
133
+ children: [/* @__PURE__ */ y("div", {
128
134
  className: "min-w-0 flex-1",
129
- children: [/* @__PURE__ */ _("p", {
135
+ children: [/* @__PURE__ */ v("p", {
130
136
  className: "text-sm font-medium text-text-primary",
131
- children: e.project?.name ?? w("timecampus.home.recentEntries.noProject", "No Project")
132
- }), /* @__PURE__ */ _("p", {
137
+ children: e.project?.name ?? T("timecampus.home.recentEntries.noProject", "No Project")
138
+ }), /* @__PURE__ */ v("p", {
133
139
  className: "text-xs text-text-secondary",
134
- children: e.description ?? w("timecampus.home.recentEntries.noDescription", "No description")
140
+ children: e.description ?? T("timecampus.home.recentEntries.noDescription", "No description")
135
141
  })]
136
- }), /* @__PURE__ */ v("div", {
142
+ }), /* @__PURE__ */ y("div", {
137
143
  className: "ml-4 text-right",
138
- children: [/* @__PURE__ */ _("p", {
144
+ children: [/* @__PURE__ */ v("p", {
139
145
  className: "font-mono text-sm font-medium tabular-nums text-text-primary",
140
146
  children: n((e.duration ?? 0) / 3600)
141
- }), /* @__PURE__ */ v("span", {
147
+ }), /* @__PURE__ */ y("span", {
142
148
  className: t("inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium", e.isRunning ? "bg-status-info-bg text-status-info-text" : "bg-status-success-bg text-status-success-text"),
143
- children: [e.isRunning && /* @__PURE__ */ _("span", { className: "h-1.5 w-1.5 rounded-full bg-status-info-text motion-safe:animate-vc-glow-pulse" }), e.isRunning ? w("timecampus.home.recentEntries.status.running", "running") : w("timecampus.home.recentEntries.status.completed", "completed")]
149
+ children: [e.isRunning && /* @__PURE__ */ v("span", { className: "h-1.5 w-1.5 rounded-full bg-status-info-text motion-safe:animate-vc-glow-pulse" }), e.isRunning ? T("timecampus.home.recentEntries.status.running", "running") : T("timecampus.home.recentEntries.status.completed", "completed")]
144
150
  })]
145
151
  })]
146
- }, e.id)), j.length === 0 && /* @__PURE__ */ _("p", {
152
+ }, e.id)), M.length === 0 && /* @__PURE__ */ v("p", {
147
153
  className: "py-4 text-center text-sm text-text-secondary",
148
- children: w("timecampus.home.recentEntries.empty", "No time entries yet")
154
+ children: T("timecampus.home.recentEntries.empty", "No time entries yet")
149
155
  })]
150
156
  })]
151
- }), /* @__PURE__ */ v(x, {
157
+ }), /* @__PURE__ */ y(S, {
152
158
  className: "p-6",
153
- children: [/* @__PURE__ */ v("div", {
159
+ children: [/* @__PURE__ */ y("div", {
154
160
  className: "mb-4",
155
- children: [/* @__PURE__ */ _("h3", {
161
+ children: [/* @__PURE__ */ v("h3", {
156
162
  className: "text-sm font-semibold text-text-primary",
157
- children: w("timecampus.home.summary.title", "Quick Summary")
158
- }), /* @__PURE__ */ _("p", {
163
+ children: T("timecampus.home.summary.title", "Quick Summary")
164
+ }), /* @__PURE__ */ v("p", {
159
165
  className: "text-xs text-text-secondary",
160
- children: w("timecampus.home.summary.description", "Time tracking overview")
166
+ children: T("timecampus.home.summary.description", "Time tracking overview")
161
167
  })]
162
- }), /* @__PURE__ */ v("div", {
168
+ }), /* @__PURE__ */ y("div", {
163
169
  className: "flex flex-col gap-4",
164
170
  children: [
165
- /* @__PURE__ */ v("div", {
171
+ /* @__PURE__ */ y("div", {
166
172
  className: "flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3",
167
- children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
173
+ children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
168
174
  className: "text-xs font-medium text-text-secondary",
169
- children: w("timecampus.home.summary.totalHours", "Total Hours")
170
- }), /* @__PURE__ */ _("p", {
175
+ children: T("timecampus.home.summary.totalHours", "Total Hours")
176
+ }), /* @__PURE__ */ v("p", {
171
177
  className: "mt-1 text-xl font-bold tabular-nums text-text-primary",
172
- children: n(A?.totalHours ?? 0)
173
- })] }), /* @__PURE__ */ _(f, { className: "h-5 w-5 text-text-secondary" })]
178
+ children: n(j?.totalHours ?? 0)
179
+ })] }), /* @__PURE__ */ v(f, { className: "h-5 w-5 text-text-secondary" })]
174
180
  }),
175
- /* @__PURE__ */ v("div", {
181
+ /* @__PURE__ */ y("div", {
176
182
  className: "flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3",
177
- children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
183
+ children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
178
184
  className: "text-xs font-medium text-text-secondary",
179
- children: w("timecampus.home.summary.billableHours", "Billable Hours")
180
- }), /* @__PURE__ */ _("p", {
185
+ children: T("timecampus.home.summary.billableHours", "Billable Hours")
186
+ }), /* @__PURE__ */ v("p", {
181
187
  className: "mt-1 text-xl font-bold tabular-nums text-text-primary",
182
- children: n(A?.billableHours ?? 0)
183
- })] }), /* @__PURE__ */ _(h, { className: "h-5 w-5 text-text-secondary" })]
188
+ children: n(j?.billableHours ?? 0)
189
+ })] }), /* @__PURE__ */ v(h, { className: "h-5 w-5 text-text-secondary" })]
184
190
  }),
185
- /* @__PURE__ */ v("div", {
191
+ /* @__PURE__ */ y("div", {
186
192
  className: "flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3",
187
- children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
193
+ children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
188
194
  className: "text-xs font-medium text-text-secondary",
189
- children: w("timecampus.home.summary.activeTimers", "Active Timers")
190
- }), /* @__PURE__ */ _("p", {
195
+ children: T("timecampus.home.summary.activeTimers", "Active Timers")
196
+ }), /* @__PURE__ */ v("p", {
191
197
  className: "mt-1 text-xl font-bold tabular-nums text-text-primary",
192
- children: A?.activeTimers ?? 0
193
- })] }), /* @__PURE__ */ _(g, { className: "h-5 w-5 text-text-secondary" })]
198
+ children: j?.activeTimers ?? 0
199
+ })] }), /* @__PURE__ */ v(g, { className: "h-5 w-5 text-text-secondary" })]
194
200
  })
195
201
  ]
196
202
  })]
197
203
  })]
198
- }),
199
- /* @__PURE__ */ v(S, {
204
+ }), /* @__PURE__ */ y(C, {
200
205
  treatment: "plain",
201
206
  className: "border-border-seam p-6",
202
- children: [/* @__PURE__ */ v("div", {
207
+ children: [/* @__PURE__ */ y("div", {
203
208
  className: "mb-4",
204
- children: [/* @__PURE__ */ _("h3", {
209
+ children: [/* @__PURE__ */ v("h3", {
205
210
  className: "text-sm font-semibold text-text-primary",
206
- children: w("timecampus.home.quickActions.title", "Quick Actions")
207
- }), /* @__PURE__ */ _("p", {
211
+ children: T("timecampus.home.quickActions.title", "Quick Actions")
212
+ }), /* @__PURE__ */ v("p", {
208
213
  className: "text-xs text-text-secondary",
209
- children: w("timecampus.home.quickActions.description", "Frequently used features")
214
+ children: T("timecampus.home.quickActions.description", "Frequently used features")
210
215
  })]
211
- }), /* @__PURE__ */ _("div", {
216
+ }), /* @__PURE__ */ v("div", {
212
217
  className: "grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6",
213
218
  children: [
214
219
  {
215
- label: w("timecampus.home.quickActions.startTimer.label", "Start Timer"),
220
+ label: T("timecampus.home.quickActions.startTimer.label", "Start Timer"),
216
221
  icon: m,
217
222
  route: "/time/timer",
218
- description: w("timecampus.home.quickActions.startTimer.description", "Track your time")
223
+ description: T("timecampus.home.quickActions.startTimer.description", "Track your time")
219
224
  },
220
225
  {
221
- label: w("timecampus.home.quickActions.viewProjects.label", "View Projects"),
226
+ label: T("timecampus.home.quickActions.viewProjects.label", "View Projects"),
222
227
  icon: p,
223
228
  route: "/projects",
224
- description: w("timecampus.home.quickActions.viewProjects.description", "Manage projects")
229
+ description: T("timecampus.home.quickActions.viewProjects.description", "Manage projects")
225
230
  },
226
231
  {
227
- label: w("timecampus.home.quickActions.timeEntries.label", "Time Entries"),
232
+ label: T("timecampus.home.quickActions.timeEntries.label", "Time Entries"),
228
233
  icon: f,
229
234
  route: "/time/entries",
230
- description: w("timecampus.home.quickActions.timeEntries.description", "View all entries")
235
+ description: T("timecampus.home.quickActions.timeEntries.description", "View all entries")
231
236
  },
232
237
  {
233
- label: w("timecampus.home.quickActions.teamActivity.label", "Team Activity"),
238
+ label: T("timecampus.home.quickActions.teamActivity.label", "Team Activity"),
234
239
  icon: g,
235
240
  route: "/team-activity",
236
- description: w("timecampus.home.quickActions.teamActivity.description", "See team status")
241
+ description: T("timecampus.home.quickActions.teamActivity.description", "See team status")
237
242
  },
238
243
  {
239
- label: w("timecampus.home.quickActions.reports.label", "Reports"),
244
+ label: T("timecampus.home.quickActions.reports.label", "Reports"),
240
245
  icon: u,
241
246
  route: "/reports",
242
- description: w("timecampus.home.quickActions.reports.description", "Generate reports")
247
+ description: T("timecampus.home.quickActions.reports.description", "Generate reports")
243
248
  },
244
249
  {
245
- label: w("timecampus.home.quickActions.approvals.label", "Approvals"),
250
+ label: T("timecampus.home.quickActions.approvals.label", "Approvals"),
246
251
  icon: d,
247
252
  route: "/time-approval",
248
- description: w("timecampus.home.quickActions.approvals.description", "Review timesheets")
253
+ description: T("timecampus.home.quickActions.approvals.description", "Review timesheets")
249
254
  }
250
- ].map(({ label: e, icon: t, description: n, route: r }) => /* @__PURE__ */ v("button", {
251
- onClick: () => T(r),
255
+ ].map(({ label: e, icon: t, description: n, route: r }) => /* @__PURE__ */ y("button", {
256
+ onClick: () => E(r),
252
257
  className: "flex min-h-[2.75rem] flex-col items-center gap-2 rounded-lg border border-border-seam bg-bg-surface p-4 text-center transition-colors hover:bg-bg-sunken/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border",
253
258
  children: [
254
- /* @__PURE__ */ _("div", {
259
+ /* @__PURE__ */ v("div", {
255
260
  className: "rounded-full bg-action-primary-bg/10 p-3",
256
- children: /* @__PURE__ */ _(t, { className: "h-5 w-5 text-primary" })
261
+ children: /* @__PURE__ */ v(t, { className: "h-5 w-5 text-primary" })
257
262
  }),
258
- /* @__PURE__ */ _("span", {
263
+ /* @__PURE__ */ v("span", {
259
264
  className: "text-sm font-medium text-text-primary",
260
265
  children: e
261
266
  }),
262
- /* @__PURE__ */ _("span", {
267
+ /* @__PURE__ */ v("span", {
263
268
  className: "text-xs text-text-secondary",
264
269
  children: n
265
270
  })
266
271
  ]
267
272
  }, e))
268
273
  })]
269
- })
274
+ })] })
270
275
  ]
271
276
  });
272
277
  };
273
278
  //#endregion
274
- export { w as HomePage };
279
+ export { T as HomePage };
275
280
 
276
281
  //# sourceMappingURL=HomePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/timecampus/pages/HomePage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport {\n Clock,\n FolderOpen,\n Users,\n TrendingUp,\n CheckCircle,\n BarChart3,\n Play,\n ArrowRight,\n} from \"lucide-react\";\nimport {\n GlassCard,\n EmphasisPanel,\n AuroraBackground,\n GradientText,\n CTAOverflowMenu,\n} from \"@burdenoff/fe-libs/ui\";\nimport { StatCard } from \"../components/StatCard\";\nimport { LoadingSkeleton } from \"../components/LoadingSkeleton\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport { cn, formatHours } from \"../utils/helpers\";\nimport { useTimeCampusNavigate } from \"../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useListTimeEntriesQuery,\n type TimeEntryFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { useTr } from \"../hooks\";\n\nexport const HomePage: FC = () => {\n const t = useTr();\n const navigate = useTimeCampusNavigate();\n\n const { data: statsData, loading: statsLoading } =\n useGetTimeEntryStatsQuery();\n const { data: entriesData, loading: entriesLoading } =\n useListTimeEntriesQuery({\n variables: { pagination: { limit: 4 } },\n });\n\n const stats = statsData?.timeEntryStats;\n const recentEntries = entriesData?.timeEntries?.items ?? [];\n\n // No time entries at all yet — a genuinely new user, not just a quiet day.\n // Swap the stat grid (which would otherwise read as four confusing zeroes)\n // for a single, honest explanation of the core loop before anything else.\n const isNewUser =\n !statsLoading && !entriesLoading && (stats?.totalEntries ?? 0) === 0;\n\n const headerActions = (\n <CTAOverflowMenu\n primary={{\n label: t(\"timecampus.home.actions.startTimer\", \"Start Timer\"),\n onSelect: () => navigate(\"/time/timer\"),\n icon: <Play className=\"h-4 w-4\" />,\n }}\n actions={[\n {\n label: t(\n \"timecampus.home.quickActions.viewProjects.label\",\n \"View Projects\",\n ),\n onSelect: () => navigate(\"/projects\"),\n icon: <FolderOpen className=\"h-4 w-4\" />,\n },\n {\n label: t(\"timecampus.home.quickActions.reports.label\", \"Reports\"),\n onSelect: () => navigate(\"/reports\"),\n icon: <BarChart3 className=\"h-4 w-4\" />,\n },\n ]}\n />\n );\n\n const renderHeader = () => (\n <div className=\"relative overflow-hidden rounded-2xl border border-border-seam bg-gloss-card p-5 sm:p-6\">\n <AuroraBackground intensity=\"subtle\" />\n <div className=\"relative flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>\n {t(\"timecampus.home.title\", \"Dashboard\")}\n </GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t(\n \"timecampus.home.description\",\n \"Overview of your time tracking and productivity\",\n )}\n </p>\n </div>\n {headerActions}\n </div>\n </div>\n );\n\n if (statsLoading && entriesLoading) {\n return (\n <div className=\"min-h-full space-y-6 p-4 sm:p-6\">\n {renderHeader()}\n <LoadingSkeleton variant=\"card\" count={4} />\n </div>\n );\n }\n\n return (\n <div className=\"min-h-full space-y-6 p-4 sm:p-6\">\n {renderHeader()}\n\n {/* Hero metric + supporting metrics — or, for a genuinely new user with\n no time entries yet, a single honest explanation of the core loop\n instead of a grid of confusing zeroes. */}\n {isNewUser ? (\n <EmptyState\n illustration=\"empty-data\"\n title={t(\n \"timecampus.home.gettingStarted.title\",\n \"Let's get you started\",\n )}\n description={t(\n \"timecampus.home.gettingStarted.description\",\n \"TimeCampus tracks your time when you start a timer — stop it when you're done, and everything else (your Timeline, Focus Score, and Reports) fills in automatically from what you track. No extra setup needed.\",\n )}\n action={\n <button\n type=\"button\"\n onClick={() => navigate(\"/time/timer\")}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Play className=\"h-4 w-4\" />\n {t(\n \"timecampus.home.gettingStarted.action\",\n \"Start your first timer\",\n )}\n </button>\n }\n />\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n <StatCard\n featured\n title={t(\"timecampus.home.stats.today\", \"Today\")}\n value={formatHours(stats?.totalHours ?? 0)}\n icon={<Clock className=\"h-5 w-5\" />}\n trend={{\n value: 12.5,\n label: t(\"timecampus.home.stats.vsYesterday\", \"vs yesterday\"),\n }}\n />\n <StatCard\n title={t(\"timecampus.home.stats.billable\", \"Billable\")}\n value={formatHours(stats?.billableHours ?? 0)}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n description={`${stats?.totalEntries ?? 0} ${t(\"timecampus.home.stats.entries\", \"entries\")}`}\n />\n <StatCard\n title={t(\"timecampus.home.stats.activeTimers\", \"Active Timers\")}\n value={stats?.activeTimers ?? 0}\n icon={<FolderOpen className=\"h-5 w-5\" />}\n description={t(\n \"timecampus.home.stats.currentlyRunning\",\n \"Currently running\",\n )}\n />\n <StatCard\n title={t(\"timecampus.home.stats.totalEntries\", \"Entries\")}\n value={stats?.totalEntries ?? 0}\n icon={<BarChart3 className=\"h-5 w-5\" />}\n description={t(\n \"timecampus.home.stats.totalEntriesDescription\",\n \"Total time entries\",\n )}\n />\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Recent Time Entries */}\n <GlassCard\n treatment=\"plain\"\n className=\"border-border-seam p-6 lg:col-span-2\"\n >\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {t(\n \"timecampus.home.recentEntries.title\",\n \"Recent Time Entries\",\n )}\n </h3>\n <p className=\"text-xs text-text-secondary\">\n {t(\n \"timecampus.home.recentEntries.description\",\n \"Your latest tracked activities\",\n )}\n </p>\n </div>\n <button\n onClick={() => navigate(\"/time/entries\")}\n className=\"inline-flex min-h-[2.75rem] items-center gap-1 rounded-md px-2 text-xs font-medium text-primary transition-colors hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border\"\n >\n {t(\"timecampus.home.recentEntries.viewAll\", \"View all\")}{\" \"}\n <ArrowRight className=\"h-3 w-3\" />\n </button>\n </div>\n {entriesLoading ? (\n <LoadingSkeleton variant=\"list\" count={4} />\n ) : (\n <div className=\"flex flex-col gap-3\">\n {recentEntries.map((entry: TimeEntryFieldsFragment) => (\n <div\n key={entry.id}\n className=\"flex items-center justify-between rounded-lg border border-border-seam p-3 transition-colors hover:bg-bg-sunken/50\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-text-primary\">\n {entry.project?.name ??\n t(\n \"timecampus.home.recentEntries.noProject\",\n \"No Project\",\n )}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {entry.description ??\n t(\n \"timecampus.home.recentEntries.noDescription\",\n \"No description\",\n )}\n </p>\n </div>\n <div className=\"ml-4 text-right\">\n <p className=\"font-mono text-sm font-medium tabular-nums text-text-primary\">\n {formatHours((entry.duration ?? 0) / 3600)}\n </p>\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium\",\n entry.isRunning\n ? \"bg-status-info-bg text-status-info-text\"\n : \"bg-status-success-bg text-status-success-text\",\n )}\n >\n {entry.isRunning && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-status-info-text motion-safe:animate-vc-glow-pulse\" />\n )}\n {entry.isRunning\n ? t(\n \"timecampus.home.recentEntries.status.running\",\n \"running\",\n )\n : t(\n \"timecampus.home.recentEntries.status.completed\",\n \"completed\",\n )}\n </span>\n </div>\n </div>\n ))}\n {recentEntries.length === 0 && (\n <p className=\"py-4 text-center text-sm text-text-secondary\">\n {t(\n \"timecampus.home.recentEntries.empty\",\n \"No time entries yet\",\n )}\n </p>\n )}\n </div>\n )}\n </GlassCard>\n\n {/* Quick Summary — the one emphasis zone */}\n <EmphasisPanel className=\"p-6\">\n <div className=\"mb-4\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {t(\"timecampus.home.summary.title\", \"Quick Summary\")}\n </h3>\n <p className=\"text-xs text-text-secondary\">\n {t(\n \"timecampus.home.summary.description\",\n \"Time tracking overview\",\n )}\n </p>\n </div>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3\">\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">\n {t(\"timecampus.home.summary.totalHours\", \"Total Hours\")}\n </p>\n <p className=\"mt-1 text-xl font-bold tabular-nums text-text-primary\">\n {formatHours(stats?.totalHours ?? 0)}\n </p>\n </div>\n <Clock className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3\">\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">\n {t(\"timecampus.home.summary.billableHours\", \"Billable Hours\")}\n </p>\n <p className=\"mt-1 text-xl font-bold tabular-nums text-text-primary\">\n {formatHours(stats?.billableHours ?? 0)}\n </p>\n </div>\n <TrendingUp className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3\">\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">\n {t(\"timecampus.home.summary.activeTimers\", \"Active Timers\")}\n </p>\n <p className=\"mt-1 text-xl font-bold tabular-nums text-text-primary\">\n {stats?.activeTimers ?? 0}\n </p>\n </div>\n <Users className=\"h-5 w-5 text-text-secondary\" />\n </div>\n </div>\n </EmphasisPanel>\n </div>\n\n {/* Quick Actions */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <div className=\"mb-4\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {t(\"timecampus.home.quickActions.title\", \"Quick Actions\")}\n </h3>\n <p className=\"text-xs text-text-secondary\">\n {t(\n \"timecampus.home.quickActions.description\",\n \"Frequently used features\",\n )}\n </p>\n </div>\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6\">\n {[\n {\n label: t(\n \"timecampus.home.quickActions.startTimer.label\",\n \"Start Timer\",\n ),\n icon: Play,\n route: \"/time/timer\",\n description: t(\n \"timecampus.home.quickActions.startTimer.description\",\n \"Track your time\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.viewProjects.label\",\n \"View Projects\",\n ),\n icon: FolderOpen,\n route: \"/projects\",\n description: t(\n \"timecampus.home.quickActions.viewProjects.description\",\n \"Manage projects\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.timeEntries.label\",\n \"Time Entries\",\n ),\n icon: Clock,\n route: \"/time/entries\",\n description: t(\n \"timecampus.home.quickActions.timeEntries.description\",\n \"View all entries\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.teamActivity.label\",\n \"Team Activity\",\n ),\n icon: Users,\n route: \"/team-activity\",\n description: t(\n \"timecampus.home.quickActions.teamActivity.description\",\n \"See team status\",\n ),\n },\n {\n label: t(\"timecampus.home.quickActions.reports.label\", \"Reports\"),\n icon: BarChart3,\n route: \"/reports\",\n description: t(\n \"timecampus.home.quickActions.reports.description\",\n \"Generate reports\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.approvals.label\",\n \"Approvals\",\n ),\n icon: CheckCircle,\n route: \"/time-approval\",\n description: t(\n \"timecampus.home.quickActions.approvals.description\",\n \"Review timesheets\",\n ),\n },\n ].map(({ label, icon: Icon, description, route }) => (\n <button\n key={label}\n onClick={() => navigate(route)}\n className=\"flex min-h-[2.75rem] flex-col items-center gap-2 rounded-lg border border-border-seam bg-bg-surface p-4 text-center transition-colors hover:bg-bg-sunken/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border\"\n >\n <div className=\"rounded-full bg-action-primary-bg/10 p-3\">\n <Icon className=\"h-5 w-5 text-primary\" />\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {label}\n </span>\n <span className=\"text-xs text-text-secondary\">{description}</span>\n </button>\n ))}\n </div>\n </GlassCard>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"HomePage.js","names":[],"sources":["../../../src/timecampus/pages/HomePage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport {\n Clock,\n FolderOpen,\n Users,\n TrendingUp,\n CheckCircle,\n BarChart3,\n Play,\n ArrowRight,\n} from \"lucide-react\";\nimport {\n GlassCard,\n EmphasisPanel,\n AuroraBackground,\n GradientText,\n CTAOverflowMenu,\n} from \"@burdenoff/fe-libs/ui\";\nimport { StatCard } from \"../components/StatCard\";\nimport { LoadingSkeleton } from \"../components/LoadingSkeleton\";\nimport { EmptyState } from \"../components/EmptyState\";\nimport { cn, formatHours } from \"../utils/helpers\";\nimport { useTimeCampusNavigate } from \"../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useListTimeEntriesQuery,\n type TimeEntryFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { useTr } from \"../hooks\";\n\nexport const HomePage: FC = () => {\n const t = useTr();\n const navigate = useTimeCampusNavigate();\n\n const { data: statsData, loading: statsLoading } =\n useGetTimeEntryStatsQuery();\n const { data: entriesData, loading: entriesLoading } =\n useListTimeEntriesQuery({\n variables: { pagination: { limit: 4 } },\n });\n\n const stats = statsData?.timeEntryStats;\n const recentEntries = entriesData?.timeEntries?.items ?? [];\n\n // No time entries at all yet — a genuinely new user, not just a quiet day.\n // Swap the stat grid (which would otherwise read as four confusing zeroes)\n // for a single, honest explanation of the core loop before anything else.\n const isNewUser =\n !statsLoading && !entriesLoading && (stats?.totalEntries ?? 0) === 0;\n\n const headerActions = (\n <CTAOverflowMenu\n primary={{\n label: t(\"timecampus.home.actions.startTimer\", \"Start Timer\"),\n onSelect: () => navigate(\"/time/timer\"),\n icon: <Play className=\"h-4 w-4\" />,\n }}\n actions={[\n {\n label: t(\n \"timecampus.home.quickActions.viewProjects.label\",\n \"View Projects\",\n ),\n onSelect: () => navigate(\"/projects\"),\n icon: <FolderOpen className=\"h-4 w-4\" />,\n },\n {\n label: t(\"timecampus.home.quickActions.reports.label\", \"Reports\"),\n onSelect: () => navigate(\"/reports\"),\n icon: <BarChart3 className=\"h-4 w-4\" />,\n },\n ]}\n />\n );\n\n const renderHeader = () => (\n <div className=\"relative overflow-hidden rounded-2xl border border-border-seam bg-gloss-card p-5 sm:p-6\">\n <AuroraBackground intensity=\"subtle\" />\n <div className=\"relative flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0\">\n <h1 className=\"text-2xl font-bold text-text-primary\">\n <GradientText>\n {t(\"timecampus.home.title\", \"Dashboard\")}\n </GradientText>\n </h1>\n <p className=\"mt-1 text-sm text-text-secondary\">\n {t(\n \"timecampus.home.description\",\n \"Overview of your time tracking and productivity\",\n )}\n </p>\n </div>\n {headerActions}\n </div>\n </div>\n );\n\n if (statsLoading && entriesLoading) {\n return (\n <div className=\"min-h-full space-y-6 p-4 sm:p-6\">\n {renderHeader()}\n <LoadingSkeleton variant=\"card\" count={4} />\n </div>\n );\n }\n\n return (\n <div className=\"min-h-full space-y-6 p-4 sm:p-6\">\n {renderHeader()}\n\n {/* Hero metric + supporting metrics — or, for a genuinely new user with\n no time entries yet, a single honest explanation of the core loop\n instead of a grid of confusing zeroes. */}\n {isNewUser ? (\n <div className=\"flex flex-col items-center gap-3\">\n <EmptyState\n illustration=\"empty-data\"\n title={t(\n \"timecampus.home.gettingStarted.title\",\n \"Let's get you started\",\n )}\n description={t(\n \"timecampus.home.gettingStarted.description\",\n \"TimeCampus tracks your time when you start a timer — stop it when you're done, and everything else (your Timeline, Focus Score, and Reports) fills in automatically from what you track. No extra setup needed.\",\n )}\n action={\n <button\n type=\"button\"\n onClick={() => navigate(\"/time/timer\")}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Play className=\"h-4 w-4\" />\n {t(\n \"timecampus.home.gettingStarted.action\",\n \"Start your first timer\",\n )}\n </button>\n }\n />\n <p className=\"max-w-md text-center text-xs text-text-secondary\">\n {t(\n \"timecampus.home.gettingStarted.footnote\",\n \"That's the only thing to set up. Pomodoro, Life tracking, reports and everything else in the sidebar are there whenever you're curious — nothing else needs configuring first.\",\n )}\n </p>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n <StatCard\n featured\n title={t(\"timecampus.home.stats.today\", \"Today\")}\n value={formatHours(stats?.totalHours ?? 0)}\n icon={<Clock className=\"h-5 w-5\" />}\n trend={{\n value: 12.5,\n label: t(\"timecampus.home.stats.vsYesterday\", \"vs yesterday\"),\n }}\n />\n <StatCard\n title={t(\"timecampus.home.stats.billable\", \"Billable\")}\n value={formatHours(stats?.billableHours ?? 0)}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n description={`${stats?.totalEntries ?? 0} ${t(\"timecampus.home.stats.entries\", \"entries\")}`}\n />\n <StatCard\n title={t(\"timecampus.home.stats.activeTimers\", \"Active Timers\")}\n value={stats?.activeTimers ?? 0}\n icon={<FolderOpen className=\"h-5 w-5\" />}\n description={t(\n \"timecampus.home.stats.currentlyRunning\",\n \"Currently running\",\n )}\n />\n <StatCard\n title={t(\"timecampus.home.stats.totalEntries\", \"Entries\")}\n value={stats?.totalEntries ?? 0}\n icon={<BarChart3 className=\"h-5 w-5\" />}\n description={t(\n \"timecampus.home.stats.totalEntriesDescription\",\n \"Total time entries\",\n )}\n />\n </div>\n )}\n\n {/* Everything below is exploration/secondary surface — Recent Entries,\n Quick Summary, and the 6-button Quick Actions grid (which includes\n Team Activity and Approvals, not relevant before someone has\n tracked anything). Showing it alongside the single-CTA getting-\n started card undercuts \"just do this one thing\"; hold it back\n until the user has a first entry, then it appears exactly as\n before — same order, same content, no other pages changed. */}\n {!isNewUser && (\n <>\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Recent Time Entries */}\n <GlassCard\n treatment=\"plain\"\n className=\"border-border-seam p-6 lg:col-span-2\"\n >\n <div className=\"mb-4 flex items-center justify-between\">\n <div>\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {t(\n \"timecampus.home.recentEntries.title\",\n \"Recent Time Entries\",\n )}\n </h3>\n <p className=\"text-xs text-text-secondary\">\n {t(\n \"timecampus.home.recentEntries.description\",\n \"Your latest tracked activities\",\n )}\n </p>\n </div>\n <button\n onClick={() => navigate(\"/time/entries\")}\n className=\"inline-flex min-h-[2.75rem] items-center gap-1 rounded-md px-2 text-xs font-medium text-primary transition-colors hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border\"\n >\n {t(\"timecampus.home.recentEntries.viewAll\", \"View all\")}{\" \"}\n <ArrowRight className=\"h-3 w-3\" />\n </button>\n </div>\n {entriesLoading ? (\n <LoadingSkeleton variant=\"list\" count={4} />\n ) : (\n <div className=\"flex flex-col gap-3\">\n {recentEntries.map((entry: TimeEntryFieldsFragment) => (\n <div\n key={entry.id}\n className=\"flex items-center justify-between rounded-lg border border-border-seam p-3 transition-colors hover:bg-bg-sunken/50\"\n >\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-medium text-text-primary\">\n {entry.project?.name ??\n t(\n \"timecampus.home.recentEntries.noProject\",\n \"No Project\",\n )}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {entry.description ??\n t(\n \"timecampus.home.recentEntries.noDescription\",\n \"No description\",\n )}\n </p>\n </div>\n <div className=\"ml-4 text-right\">\n <p className=\"font-mono text-sm font-medium tabular-nums text-text-primary\">\n {formatHours((entry.duration ?? 0) / 3600)}\n </p>\n <span\n className={cn(\n \"inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium\",\n entry.isRunning\n ? \"bg-status-info-bg text-status-info-text\"\n : \"bg-status-success-bg text-status-success-text\",\n )}\n >\n {entry.isRunning && (\n <span className=\"h-1.5 w-1.5 rounded-full bg-status-info-text motion-safe:animate-vc-glow-pulse\" />\n )}\n {entry.isRunning\n ? t(\n \"timecampus.home.recentEntries.status.running\",\n \"running\",\n )\n : t(\n \"timecampus.home.recentEntries.status.completed\",\n \"completed\",\n )}\n </span>\n </div>\n </div>\n ))}\n {recentEntries.length === 0 && (\n <p className=\"py-4 text-center text-sm text-text-secondary\">\n {t(\n \"timecampus.home.recentEntries.empty\",\n \"No time entries yet\",\n )}\n </p>\n )}\n </div>\n )}\n </GlassCard>\n\n {/* Quick Summary — the one emphasis zone */}\n <EmphasisPanel className=\"p-6\">\n <div className=\"mb-4\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {t(\"timecampus.home.summary.title\", \"Quick Summary\")}\n </h3>\n <p className=\"text-xs text-text-secondary\">\n {t(\n \"timecampus.home.summary.description\",\n \"Time tracking overview\",\n )}\n </p>\n </div>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3\">\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">\n {t(\"timecampus.home.summary.totalHours\", \"Total Hours\")}\n </p>\n <p className=\"mt-1 text-xl font-bold tabular-nums text-text-primary\">\n {formatHours(stats?.totalHours ?? 0)}\n </p>\n </div>\n <Clock className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3\">\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">\n {t(\n \"timecampus.home.summary.billableHours\",\n \"Billable Hours\",\n )}\n </p>\n <p className=\"mt-1 text-xl font-bold tabular-nums text-text-primary\">\n {formatHours(stats?.billableHours ?? 0)}\n </p>\n </div>\n <TrendingUp className=\"h-5 w-5 text-text-secondary\" />\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-seam bg-bg-surface/40 p-3\">\n <div>\n <p className=\"text-xs font-medium text-text-secondary\">\n {t(\n \"timecampus.home.summary.activeTimers\",\n \"Active Timers\",\n )}\n </p>\n <p className=\"mt-1 text-xl font-bold tabular-nums text-text-primary\">\n {stats?.activeTimers ?? 0}\n </p>\n </div>\n <Users className=\"h-5 w-5 text-text-secondary\" />\n </div>\n </div>\n </EmphasisPanel>\n </div>\n\n {/* Quick Actions */}\n <GlassCard treatment=\"plain\" className=\"border-border-seam p-6\">\n <div className=\"mb-4\">\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {t(\"timecampus.home.quickActions.title\", \"Quick Actions\")}\n </h3>\n <p className=\"text-xs text-text-secondary\">\n {t(\n \"timecampus.home.quickActions.description\",\n \"Frequently used features\",\n )}\n </p>\n </div>\n <div className=\"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-6\">\n {[\n {\n label: t(\n \"timecampus.home.quickActions.startTimer.label\",\n \"Start Timer\",\n ),\n icon: Play,\n route: \"/time/timer\",\n description: t(\n \"timecampus.home.quickActions.startTimer.description\",\n \"Track your time\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.viewProjects.label\",\n \"View Projects\",\n ),\n icon: FolderOpen,\n route: \"/projects\",\n description: t(\n \"timecampus.home.quickActions.viewProjects.description\",\n \"Manage projects\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.timeEntries.label\",\n \"Time Entries\",\n ),\n icon: Clock,\n route: \"/time/entries\",\n description: t(\n \"timecampus.home.quickActions.timeEntries.description\",\n \"View all entries\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.teamActivity.label\",\n \"Team Activity\",\n ),\n icon: Users,\n route: \"/team-activity\",\n description: t(\n \"timecampus.home.quickActions.teamActivity.description\",\n \"See team status\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.reports.label\",\n \"Reports\",\n ),\n icon: BarChart3,\n route: \"/reports\",\n description: t(\n \"timecampus.home.quickActions.reports.description\",\n \"Generate reports\",\n ),\n },\n {\n label: t(\n \"timecampus.home.quickActions.approvals.label\",\n \"Approvals\",\n ),\n icon: CheckCircle,\n route: \"/time-approval\",\n description: t(\n \"timecampus.home.quickActions.approvals.description\",\n \"Review timesheets\",\n ),\n },\n ].map(({ label, icon: Icon, description, route }) => (\n <button\n key={label}\n onClick={() => navigate(route)}\n className=\"flex min-h-[2.75rem] flex-col items-center gap-2 rounded-lg border border-border-seam bg-bg-surface p-4 text-center transition-colors hover:bg-bg-sunken/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-border\"\n >\n <div className=\"rounded-full bg-action-primary-bg/10 p-3\">\n <Icon className=\"h-5 w-5 text-primary\" />\n </div>\n <span className=\"text-sm font-medium text-text-primary\">\n {label}\n </span>\n <span className=\"text-xs text-text-secondary\">\n {description}\n </span>\n </button>\n ))}\n </div>\n </GlassCard>\n </>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;AA8BA,IAAa,UAAqB;CAChC,IAAM,IAAI,EAAM,GACV,IAAW,EAAsB,GAEjC,EAAE,MAAM,GAAW,SAAS,MAChC,EAA0B,GACtB,EAAE,MAAM,GAAa,SAAS,MAClC,EAAwB,EACtB,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EACxC,CAAC,GAEG,IAAQ,GAAW,gBACnB,IAAgB,GAAa,aAAa,SAAS,CAAC,GAKpD,IACJ,CAAC,KAAgB,CAAC,MAAmB,GAAO,gBAAgB,OAAO,GAE/D,IACJ,kBAAC,GAAD;EACE,SAAS;GACP,OAAO,EAAE,sCAAsC,aAAa;GAC5D,gBAAgB,EAAS,aAAa;GACtC,MAAM,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA;EACnC;EACA,SAAS,CACP;GACE,OAAO,EACL,mDACA,eACF;GACA,gBAAgB,EAAS,WAAW;GACpC,MAAM,kBAAC,GAAD,EAAY,WAAU,UAAW,CAAA;EACzC,GACA;GACE,OAAO,EAAE,8CAA8C,SAAS;GAChE,gBAAgB,EAAS,UAAU;GACnC,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;EACxC,CACF;CACD,CAAA,GAGG,UACJ,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,kBAAC,GAAD,EAAkB,WAAU,SAAU,CAAA,GACtC,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;KACZ,UAAA,kBAAC,GAAD,EAAA,UACG,EAAE,yBAAyB,WAAW,EAC3B,CAAA;IACZ,CAAA,GACJ,kBAAC,KAAD;KAAG,WAAU;KACV,UAAA,EACC,+BACA,iDACF;IACC,CAAA,CACA;GACJ,CAAA,GAAA,CACE;EACF,CAAA,CAAA;;CAYP,OATI,KAAgB,IAEhB,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACG,EAAa,GACd,kBAAC,GAAD;GAAiB,SAAQ;GAAO,OAAO;EAAI,CAAA,CACxC;MAKP,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACG,EAAa;GAKb,IACC,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,kBAAC,GAAD;KACE,cAAa;KACb,OAAO,EACL,wCACA,uBACF;KACA,aAAa,EACX,8CACA,iNACF;KACA,QACE,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAS,aAAa;MACrC,WAAU;MAHZ,UAAA,CAKE,kBAAC,GAAD,EAAM,WAAU,UAAW,CAAA,GAC1B,EACC,yCACA,wBACF,CACM;;IAEX,CAAA,GACD,kBAAC,KAAD;KAAG,WAAU;KACV,UAAA,EACC,2CACA,gLACF;IACC,CAAA,CACA;GAEL,CAAA,IAAA,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,kBAAC,GAAD;MACE,UAAA;MACA,OAAO,EAAE,+BAA+B,OAAO;MAC/C,OAAO,EAAY,GAAO,cAAc,CAAC;MACzC,MAAM,kBAAC,GAAD,EAAO,WAAU,UAAW,CAAA;MAClC,OAAO;OACL,OAAO;OACP,OAAO,EAAE,qCAAqC,cAAc;MAC9D;KACD,CAAA;KACD,kBAAC,GAAD;MACE,OAAO,EAAE,kCAAkC,UAAU;MACrD,OAAO,EAAY,GAAO,iBAAiB,CAAC;MAC5C,MAAM,kBAAC,GAAD,EAAY,WAAU,UAAW,CAAA;MACvC,aAAa,GAAG,GAAO,gBAAgB,EAAE,GAAG,EAAE,iCAAiC,SAAS;KACzF,CAAA;KACD,kBAAC,GAAD;MACE,OAAO,EAAE,sCAAsC,eAAe;MAC9D,OAAO,GAAO,gBAAgB;MAC9B,MAAM,kBAAC,GAAD,EAAY,WAAU,UAAW,CAAA;MACvC,aAAa,EACX,0CACA,mBACF;KACD,CAAA;KACD,kBAAC,GAAD;MACE,OAAO,EAAE,sCAAsC,SAAS;MACxD,OAAO,GAAO,gBAAgB;MAC9B,MAAM,kBAAC,GAAD,EAAW,WAAU,UAAW,CAAA;MACtC,aAAa,EACX,iDACA,oBACF;KACD,CAAA;IACE;;GAUN,CAAC,KACA,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CAEE,kBAAC,GAAD;KACE,WAAU;KACV,WAAU;KAFZ,UAAA,CAIE,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;OACX,UAAA,EACC,uCACA,qBACF;MACE,CAAA,GACJ,kBAAC,KAAD;OAAG,WAAU;OACV,UAAA,EACC,6CACA,gCACF;MACC,CAAA,CACA,EAAA,CAAA,GACL,kBAAC,UAAD;OACE,eAAe,EAAS,eAAe;OACvC,WAAU;OAFZ,UAAA;QAIG,EAAE,yCAAyC,UAAU;QAAG;QACzD,kBAAC,GAAD,EAAY,WAAU,UAAW,CAAA;OAC3B;MACL,CAAA,CAAA;KACJ,CAAA,GAAA,IACC,kBAAC,GAAD;MAAiB,SAAQ;MAAO,OAAO;KAAI,CAAA,IAE3C,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACG,EAAc,KAAK,MAClB,kBAAC,OAAD;OAEE,WAAU;OAFZ,UAAA,CAIE,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;SACV,UAAA,EAAM,SAAS,QACd,EACE,2CACA,YACF;QACD,CAAA,GACH,kBAAC,KAAD;SAAG,WAAU;SACV,UAAA,EAAM,eACL,EACE,+CACA,gBACF;QACD,CAAA,CACA;OACL,CAAA,GAAA,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;SACV,UAAA,GAAa,EAAM,YAAY,KAAK,IAAI;QACxC,CAAA,GACH,kBAAC,QAAD;SACE,WAAW,EACT,iFACA,EAAM,YACF,4CACA,+CACN;SANF,UAAA,CAQG,EAAM,aACL,kBAAC,QAAD,EAAM,WAAU,iFAAkF,CAAA,GAEnG,EAAM,YACH,EACE,gDACA,SACF,IACA,EACE,kDACA,WACF,CACA;QACH,CAAA,CAAA;OACF,CAAA,CAAA;MA7CE,GAAA,EAAM,EA6CR,CACN,GACA,EAAc,WAAW,KACxB,kBAAC,KAAD;OAAG,WAAU;OACV,UAAA,EACC,uCACA,qBACF;MACC,CAAA,CAEF;KAEE,CAAA,CAAA;IAGX,CAAA,GAAA,kBAAC,GAAD;KAAe,WAAU;KAAzB,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,kBAAC,MAAD;OAAI,WAAU;OACX,UAAA,EAAE,iCAAiC,eAAe;MACjD,CAAA,GACJ,kBAAC,KAAD;OAAG,WAAU;OACV,UAAA,EACC,uCACA,wBACF;MACC,CAAA,CACA;KACL,CAAA,GAAA,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;SACV,UAAA,EAAE,sCAAsC,aAAa;QACrD,CAAA,GACH,kBAAC,KAAD;SAAG,WAAU;SACV,UAAA,EAAY,GAAO,cAAc,CAAC;QAClC,CAAA,CACA,EAAA,CAAA,GACL,kBAAC,GAAD,EAAO,WAAU,8BAA+B,CAAA,CAC7C;;OACL,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;SACV,UAAA,EACC,yCACA,gBACF;QACC,CAAA,GACH,kBAAC,KAAD;SAAG,WAAU;SACV,UAAA,EAAY,GAAO,iBAAiB,CAAC;QACrC,CAAA,CACA,EAAA,CAAA,GACL,kBAAC,GAAD,EAAY,WAAU,8BAA+B,CAAA,CAClD;;OACL,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;SAAG,WAAU;SACV,UAAA,EACC,wCACA,eACF;QACC,CAAA,GACH,kBAAC,KAAD;SAAG,WAAU;SACV,UAAA,GAAO,gBAAgB;QACvB,CAAA,CACA,EAAA,CAAA,GACL,kBAAC,GAAD,EAAO,WAAU,8BAA+B,CAAA,CAC7C;;MACF;KACQ,CAAA,CAAA;IACZ,CAAA,CAAA;GAGL,CAAA,GAAA,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;IAAvC,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,kBAAC,MAAD;MAAI,WAAU;MACX,UAAA,EAAE,sCAAsC,eAAe;KACtD,CAAA,GACJ,kBAAC,KAAD;MAAG,WAAU;MACV,UAAA,EACC,4CACA,0BACF;KACC,CAAA,CACA;IACL,CAAA,GAAA,kBAAC,OAAD;KAAK,WAAU;KACZ,UAAA;MACC;OACE,OAAO,EACL,iDACA,aACF;OACA,MAAM;OACN,OAAO;OACP,aAAa,EACX,uDACA,iBACF;MACF;MACA;OACE,OAAO,EACL,mDACA,eACF;OACA,MAAM;OACN,OAAO;OACP,aAAa,EACX,yDACA,iBACF;MACF;MACA;OACE,OAAO,EACL,kDACA,cACF;OACA,MAAM;OACN,OAAO;OACP,aAAa,EACX,wDACA,kBACF;MACF;MACA;OACE,OAAO,EACL,mDACA,eACF;OACA,MAAM;OACN,OAAO;OACP,aAAa,EACX,yDACA,iBACF;MACF;MACA;OACE,OAAO,EACL,8CACA,SACF;OACA,MAAM;OACN,OAAO;OACP,aAAa,EACX,oDACA,kBACF;MACF;MACA;OACE,OAAO,EACL,gDACA,WACF;OACA,MAAM;OACN,OAAO;OACP,aAAa,EACX,sDACA,mBACF;MACF;KACF,CAAC,CAAC,KAAK,EAAE,UAAO,MAAM,GAAM,gBAAa,eACvC,kBAAC,UAAD;MAEE,eAAe,EAAS,CAAK;MAC7B,WAAU;MAHZ,UAAA;OAKE,kBAAC,OAAD;QAAK,WAAU;QACb,UAAA,kBAAC,GAAD,EAAM,WAAU,uBAAwB,CAAA;OACrC,CAAA;OACL,kBAAC,QAAD;QAAM,WAAU;QACb,UAAA;OACG,CAAA;OACN,kBAAC,QAAD;QAAM,WAAU;QACb,UAAA;OACG,CAAA;MACA;KAbD,GAAA,CAaC,CACT;IACE,CAAA,CACI;GACX,CAAA,CAAA,EAAA,CAAA;EAED;;AAET"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-timecampus",
3
- "version": "2026.903.1",
3
+ "version": "2026.904.1",
4
4
  "description": "Burdenoff TimeCampus Microfrontend - AI-powered time management and productivity platform",
5
5
  "type": "module",
6
6
  "files": [