@burdenoff/microfe-proserviceworld 2026.706.2 → 2026.709.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 (108) hide show
  1. package/dist/dev/main.d.ts +2 -0
  2. package/dist/dev/main.d.ts.map +1 -0
  3. package/dist/generated/global-operations.d.ts +2 -0
  4. package/dist/generated/global-operations.d.ts.map +1 -0
  5. package/dist/generated/global-types.d.ts +18199 -0
  6. package/dist/generated/global-types.d.ts.map +1 -0
  7. package/dist/generated/wspace-operations.d.ts +2 -0
  8. package/dist/generated/wspace-operations.d.ts.map +1 -0
  9. package/dist/generated/wspace-types.d.ts +43046 -0
  10. package/dist/generated/wspace-types.d.ts.map +1 -0
  11. package/dist/index.d.ts +2 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +2 -1
  14. package/dist/proserviceworld/ProServiceWorldRoot.d.ts +5 -0
  15. package/dist/proserviceworld/ProServiceWorldRoot.d.ts.map +1 -0
  16. package/dist/proserviceworld/ProServiceWorldRoutes.d.ts +2 -0
  17. package/dist/proserviceworld/ProServiceWorldRoutes.d.ts.map +1 -0
  18. package/dist/proserviceworld/components/DiscussionThread.d.ts +12 -0
  19. package/dist/proserviceworld/components/DiscussionThread.d.ts.map +1 -0
  20. package/dist/proserviceworld/components/DiscussionThread.js +1 -1
  21. package/dist/proserviceworld/components/DiscussionThread.js.map +1 -1
  22. package/dist/proserviceworld/components/ui.d.ts +82 -0
  23. package/dist/proserviceworld/components/ui.d.ts.map +1 -0
  24. package/dist/proserviceworld/components/ui.js +18 -18
  25. package/dist/proserviceworld/components/ui.js.map +1 -1
  26. package/dist/proserviceworld/hooks/useAnalytics.d.ts +18 -0
  27. package/dist/proserviceworld/hooks/useAnalytics.d.ts.map +1 -0
  28. package/dist/proserviceworld/hooks/useAnalytics.js +21 -0
  29. package/dist/proserviceworld/hooks/useAnalytics.js.map +1 -0
  30. package/dist/proserviceworld/hooks/useEntityComments.d.ts +27 -0
  31. package/dist/proserviceworld/hooks/useEntityComments.d.ts.map +1 -0
  32. package/dist/proserviceworld/hooks/useEntityComments.js.map +1 -1
  33. package/dist/proserviceworld/hooks/useFiles.d.ts +23 -0
  34. package/dist/proserviceworld/hooks/useFiles.d.ts.map +1 -0
  35. package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts +351 -0
  36. package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts.map +1 -0
  37. package/dist/proserviceworld/index.d.ts +5 -0
  38. package/dist/proserviceworld/index.d.ts.map +1 -0
  39. package/dist/proserviceworld/index.js +1 -0
  40. package/dist/proserviceworld/pages/AnalyticsPage.d.ts +4 -0
  41. package/dist/proserviceworld/pages/AnalyticsPage.d.ts.map +1 -0
  42. package/dist/proserviceworld/pages/AnalyticsPage.js +277 -111
  43. package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -1
  44. package/dist/proserviceworld/pages/ClientDetailPage.d.ts +4 -0
  45. package/dist/proserviceworld/pages/ClientDetailPage.d.ts.map +1 -0
  46. package/dist/proserviceworld/pages/ClientDetailPage.js +219 -151
  47. package/dist/proserviceworld/pages/ClientDetailPage.js.map +1 -1
  48. package/dist/proserviceworld/pages/ClientsPage.d.ts +9 -0
  49. package/dist/proserviceworld/pages/ClientsPage.d.ts.map +1 -0
  50. package/dist/proserviceworld/pages/ClientsPage.js +180 -148
  51. package/dist/proserviceworld/pages/ClientsPage.js.map +1 -1
  52. package/dist/proserviceworld/pages/CompliancePage.d.ts +4 -0
  53. package/dist/proserviceworld/pages/CompliancePage.d.ts.map +1 -0
  54. package/dist/proserviceworld/pages/CompliancePage.js +140 -96
  55. package/dist/proserviceworld/pages/CompliancePage.js.map +1 -1
  56. package/dist/proserviceworld/pages/ConflictsPage.d.ts +4 -0
  57. package/dist/proserviceworld/pages/ConflictsPage.d.ts.map +1 -0
  58. package/dist/proserviceworld/pages/DashboardPage.d.ts +4 -0
  59. package/dist/proserviceworld/pages/DashboardPage.d.ts.map +1 -0
  60. package/dist/proserviceworld/pages/DashboardPage.js +221 -104
  61. package/dist/proserviceworld/pages/DashboardPage.js.map +1 -1
  62. package/dist/proserviceworld/pages/DocumentsPage.d.ts +4 -0
  63. package/dist/proserviceworld/pages/DocumentsPage.d.ts.map +1 -0
  64. package/dist/proserviceworld/pages/EngagementDetailPage.d.ts +4 -0
  65. package/dist/proserviceworld/pages/EngagementDetailPage.d.ts.map +1 -0
  66. package/dist/proserviceworld/pages/EngagementDetailPage.js +233 -197
  67. package/dist/proserviceworld/pages/EngagementDetailPage.js.map +1 -1
  68. package/dist/proserviceworld/pages/EngagementsPage.d.ts +4 -0
  69. package/dist/proserviceworld/pages/EngagementsPage.d.ts.map +1 -0
  70. package/dist/proserviceworld/pages/EngagementsPage.js +187 -136
  71. package/dist/proserviceworld/pages/EngagementsPage.js.map +1 -1
  72. package/dist/proserviceworld/pages/InvoicesPage.d.ts +4 -0
  73. package/dist/proserviceworld/pages/InvoicesPage.d.ts.map +1 -0
  74. package/dist/proserviceworld/pages/InvoicesPage.js +144 -129
  75. package/dist/proserviceworld/pages/InvoicesPage.js.map +1 -1
  76. package/dist/proserviceworld/pages/MattersPage.d.ts +4 -0
  77. package/dist/proserviceworld/pages/MattersPage.d.ts.map +1 -0
  78. package/dist/proserviceworld/pages/MattersPage.js +198 -142
  79. package/dist/proserviceworld/pages/MattersPage.js.map +1 -1
  80. package/dist/proserviceworld/pages/PracticeAreasPage.d.ts +4 -0
  81. package/dist/proserviceworld/pages/PracticeAreasPage.d.ts.map +1 -0
  82. package/dist/proserviceworld/pages/TimePage.d.ts +4 -0
  83. package/dist/proserviceworld/pages/TimePage.d.ts.map +1 -0
  84. package/dist/proserviceworld/pages/TimePage.js +112 -92
  85. package/dist/proserviceworld/pages/TimePage.js.map +1 -1
  86. package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts +6 -0
  87. package/dist/proserviceworld/providers/ProServiceWorldProvider.d.ts.map +1 -0
  88. package/dist/proserviceworld/services/assistantApi.d.ts +74 -0
  89. package/dist/proserviceworld/services/assistantApi.d.ts.map +1 -0
  90. package/dist/proserviceworld/services/assistantApi.js +203 -0
  91. package/dist/proserviceworld/services/assistantApi.js.map +1 -0
  92. package/dist/proserviceworld/services/createSandboxAssistantTransport.d.ts +28 -0
  93. package/dist/proserviceworld/services/createSandboxAssistantTransport.d.ts.map +1 -0
  94. package/dist/proserviceworld/services/createSandboxAssistantTransport.js +120 -0
  95. package/dist/proserviceworld/services/createSandboxAssistantTransport.js.map +1 -0
  96. package/dist/proserviceworld/types/index.d.ts +57 -0
  97. package/dist/proserviceworld/types/index.d.ts.map +1 -0
  98. package/dist/proserviceworld/utils/cn.d.ts +4 -0
  99. package/dist/proserviceworld/utils/cn.d.ts.map +1 -0
  100. package/dist/proserviceworld/utils/nav.d.ts +6 -0
  101. package/dist/proserviceworld/utils/nav.d.ts.map +1 -0
  102. package/dist/proserviceworld/utils/navigation.d.ts +2 -0
  103. package/dist/proserviceworld/utils/navigation.d.ts.map +1 -0
  104. package/dist/proserviceworld/utils/pageContext.d.ts +12 -0
  105. package/dist/proserviceworld/utils/pageContext.d.ts.map +1 -0
  106. package/dist/proserviceworld/utils/pageContext.js +74 -0
  107. package/dist/proserviceworld/utils/pageContext.js.map +1 -0
  108. package/package.json +1 -1
@@ -2,13 +2,14 @@ import { useCompleteMilestone as e, useCreateDeliverable as t, useCreateMileston
2
2
  import { useNav as s } from "../utils/nav.js";
3
3
  import { Banner as c, Empty as l, ErrorState as u, Field as d, LoadingBlock as f, MetricCard as p, Modal as m, NativeSelect as h, PageHeader as g, SectionCard as _, StatusPill as v, TextArea as y, TextInput as b, fmtDate as x, fmtMinutesAsHours as S, fmtMoney as C, humanize as w } from "../components/ui.js";
4
4
  import { DiscussionThread as T } from "../components/DiscussionThread.js";
5
- import { useState as E } from "react";
6
- import { ArrowLeft as D, CheckCircle2 as O, Clock as k, FileText as A, Flag as j, Plus as M } from "lucide-react";
7
- import { useParams as N } from "react-router-dom";
8
- import { Fragment as P, jsx as F, jsxs as I } from "react/jsx-runtime";
9
- import { Button as L } from "@burdenoff/fe-libs/ui";
5
+ import { useAnalytics as E } from "../hooks/useAnalytics.js";
6
+ import { useState as D } from "react";
7
+ import { ArrowLeft as O, ArrowRight as k, CheckCircle2 as A, Clock as j, DollarSign as M, FileText as N, Flag as P, Plus as F } from "lucide-react";
8
+ import { useParams as I } from "react-router-dom";
9
+ import { Fragment as L, jsx as R, jsxs as z } from "react/jsx-runtime";
10
+ import { Button as B } from "@burdenoff/fe-libs/ui";
10
11
  //#region src/proserviceworld/pages/EngagementDetailPage.tsx
11
- var R = {
12
+ var V = {
12
13
  PROPOSAL: ["ACCEPTED", "CANCELLED"],
13
14
  ACCEPTED: ["IN_PROGRESS", "CANCELLED"],
14
15
  IN_PROGRESS: ["REVIEW", "CANCELLED"],
@@ -21,220 +22,255 @@ var R = {
21
22
  INVOICED: ["CLOSED"],
22
23
  CLOSED: [],
23
24
  CANCELLED: []
24
- }, z = [
25
+ }, H = [
25
26
  "DRAFT",
26
27
  "INTERNAL_REVIEW",
27
28
  "CLIENT_REVIEW",
28
29
  "ACCEPTED",
29
30
  "REJECTED"
30
- ], B = () => {
31
- let { id: e = "" } = N(), t = s(), { data: n, isLoading: a, error: d, refetch: m } = r(e), h = i({ engagementId: e }), y = o(), [b, O] = E(!1), [P, z] = E(!1), [B, G] = E(null);
32
- if (a) return /* @__PURE__ */ F(f, {});
33
- if (d) return /* @__PURE__ */ F(u, {
34
- error: d,
35
- onRetry: () => void m()
31
+ ], U = () => {
32
+ let { id: e = "" } = I(), t = s(), { emitFact: n } = E(), { data: a, isLoading: d, error: m, refetch: h } = r(e), y = i({ engagementId: e }), b = o(), [A, L] = D(!1), [H, U] = D(!1), [J, Y] = D(null);
33
+ if (d) return /* @__PURE__ */ R(f, {});
34
+ if (m) return /* @__PURE__ */ R(u, {
35
+ error: m,
36
+ onRetry: () => void h()
36
37
  });
37
- if (!n) return /* @__PURE__ */ F(l, { title: "Engagement not found" });
38
- let K = R[n.status] ?? [], q = (h.data?.items ?? []).reduce((e, t) => e + t.minutes, 0);
39
- return /* @__PURE__ */ I("div", {
38
+ if (!a) return /* @__PURE__ */ R(l, { title: "Engagement not found" });
39
+ let X = V[a.status] ?? [], Z = (y.data?.items ?? []).reduce((e, t) => e + t.minutes, 0);
40
+ return /* @__PURE__ */ z("div", {
40
41
  className: "space-y-6",
41
42
  children: [
42
- /* @__PURE__ */ I("button", {
43
+ /* @__PURE__ */ z("button", {
43
44
  type: "button",
44
45
  onClick: () => t("engagements"),
45
- className: "flex items-center gap-1.5 text-sm text-text-secondary hover:text-accent",
46
- children: [/* @__PURE__ */ F(D, { className: "h-4 w-4" }), " Back to engagements"]
46
+ className: "flex items-center gap-1.5 text-sm text-text-secondary transition-colors hover:text-accent",
47
+ children: [/* @__PURE__ */ R(O, { className: "h-4 w-4" }), " Back to engagements"]
47
48
  }),
48
- /* @__PURE__ */ F(g, {
49
- title: n.name,
50
- subtitle: n.client ? `${n.client.name} · ${w(n.feeArrangement)}` : w(n.feeArrangement),
51
- actions: /* @__PURE__ */ F(v, { status: n.status })
49
+ /* @__PURE__ */ R(g, {
50
+ title: a.name,
51
+ subtitle: a.client ? `${a.client.name} · ${w(a.feeArrangement)}` : w(a.feeArrangement),
52
+ actions: /* @__PURE__ */ R(v, { status: a.status })
52
53
  }),
53
- B && /* @__PURE__ */ F(c, {
54
- tone: B.tone,
55
- onClose: () => G(null),
56
- children: B.text
54
+ J && /* @__PURE__ */ R(c, {
55
+ tone: J.tone,
56
+ onClose: () => Y(null),
57
+ children: J.text
57
58
  }),
58
- /* @__PURE__ */ I("div", {
59
+ /* @__PURE__ */ z("div", {
59
60
  className: "grid grid-cols-2 gap-3 lg:grid-cols-4",
60
61
  children: [
61
- /* @__PURE__ */ F(p, {
62
+ /* @__PURE__ */ R(p, {
62
63
  label: "Fee",
63
- value: C(n.feeAmount, n.currency),
64
- hint: w(n.feeArrangement)
64
+ value: C(a.feeAmount, a.currency),
65
+ hint: w(a.feeArrangement),
66
+ icon: /* @__PURE__ */ R(M, { className: "h-4 w-4" }),
67
+ tone: "success"
65
68
  }),
66
- /* @__PURE__ */ F(p, {
69
+ /* @__PURE__ */ R(p, {
67
70
  label: "Deliverables",
68
- value: n.deliverables.length
71
+ value: a.deliverables.length,
72
+ icon: /* @__PURE__ */ R(N, { className: "h-4 w-4" }),
73
+ tone: "info"
69
74
  }),
70
- /* @__PURE__ */ F(p, {
75
+ /* @__PURE__ */ R(p, {
71
76
  label: "Milestones",
72
- value: n.milestones.length
77
+ value: a.milestones.length,
78
+ icon: /* @__PURE__ */ R(P, { className: "h-4 w-4" }),
79
+ tone: "accent"
73
80
  }),
74
- /* @__PURE__ */ F(p, {
81
+ /* @__PURE__ */ R(p, {
75
82
  label: "Time logged",
76
- value: S(q),
77
- hint: `${h.data?.totalCount ?? 0} entries`
83
+ value: S(Z),
84
+ hint: `${y.data?.totalCount ?? 0} entries`,
85
+ icon: /* @__PURE__ */ R(j, { className: "h-4 w-4" }),
86
+ tone: "warning"
78
87
  })
79
88
  ]
80
89
  }),
81
- K.length > 0 && /* @__PURE__ */ F(_, {
90
+ X.length > 0 && /* @__PURE__ */ R(_, {
82
91
  title: "Advance lifecycle",
83
- description: `Current status: ${w(n.status)}`,
84
- children: /* @__PURE__ */ F("div", {
85
- className: "flex flex-wrap gap-2",
86
- children: K.map((e) => /* @__PURE__ */ F(L, {
87
- size: "sm",
88
- variant: e === "CANCELLED" ? "outline" : "default",
89
- disabled: y.isPending,
90
- onClick: () => y.mutate({
91
- id: n.id,
92
- status: e
93
- }, {
94
- onSuccess: () => G({
95
- tone: "success",
96
- text: `Moved to ${w(e)}.`
97
- }),
98
- onError: (e) => G({
99
- tone: "danger",
100
- text: e instanceof Error ? e.message : "Transition failed."
101
- })
102
- }),
103
- children: w(e)
104
- }, e))
92
+ children: /* @__PURE__ */ z("div", {
93
+ className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
94
+ children: [/* @__PURE__ */ z("div", {
95
+ className: "flex items-center gap-2 text-sm text-text-secondary",
96
+ children: [/* @__PURE__ */ R("span", { children: "Currently" }), /* @__PURE__ */ R(v, { status: a.status })]
97
+ }), /* @__PURE__ */ R("div", {
98
+ className: "flex flex-wrap gap-2",
99
+ children: X.map((e) => {
100
+ let t = e === "CANCELLED";
101
+ return /* @__PURE__ */ z(B, {
102
+ size: "sm",
103
+ variant: t ? "outline" : "default",
104
+ disabled: b.isPending,
105
+ onClick: () => b.mutate({
106
+ id: a.id,
107
+ status: e
108
+ }, {
109
+ onSuccess: () => {
110
+ n("psw.engagement.transitioned", {
111
+ engagementId: a.id,
112
+ status: e
113
+ }), Y({
114
+ tone: "success",
115
+ text: `Moved to ${w(e)}.`
116
+ });
117
+ },
118
+ onError: (e) => Y({
119
+ tone: "danger",
120
+ text: e instanceof Error ? e.message : "Transition failed."
121
+ })
122
+ }),
123
+ children: [w(e), !t && /* @__PURE__ */ R(k, { className: "ml-1.5 h-4 w-4" })]
124
+ }, e);
125
+ })
126
+ })]
105
127
  })
106
128
  }),
107
- /* @__PURE__ */ I("div", {
129
+ /* @__PURE__ */ z("div", {
108
130
  className: "grid grid-cols-1 gap-4 lg:grid-cols-2",
109
- children: [/* @__PURE__ */ F(_, {
131
+ children: [/* @__PURE__ */ R(_, {
110
132
  title: "Deliverables",
111
- action: /* @__PURE__ */ I(L, {
133
+ action: /* @__PURE__ */ z(B, {
112
134
  size: "sm",
113
135
  variant: "outline",
114
- onClick: () => O(!0),
115
- children: [/* @__PURE__ */ F(M, { className: "mr-1.5 h-4 w-4" }), "Add"]
136
+ onClick: () => L(!0),
137
+ children: [/* @__PURE__ */ R(F, { className: "mr-1.5 h-4 w-4" }), "Add"]
116
138
  }),
117
- children: n.deliverables.length === 0 ? /* @__PURE__ */ F(l, {
139
+ children: a.deliverables.length === 0 ? /* @__PURE__ */ R(l, {
118
140
  title: "No deliverables",
119
141
  description: "Track the tangible outputs of this engagement.",
120
- icon: /* @__PURE__ */ F(A, { className: "h-7 w-7" })
121
- }) : /* @__PURE__ */ F("ul", {
122
- className: "space-y-2",
123
- children: n.deliverables.map((e) => /* @__PURE__ */ F("li", {
124
- className: "rounded-lg border border-border-seam p-3",
125
- children: /* @__PURE__ */ I("div", {
126
- className: "flex items-start justify-between gap-2",
127
- children: [/* @__PURE__ */ I("div", { children: [/* @__PURE__ */ I("div", {
128
- className: "text-sm font-medium text-text-primary",
129
- children: [
130
- e.name,
131
- " ",
132
- /* @__PURE__ */ I("span", {
133
- className: "text-xs text-text-tertiary",
142
+ icon: /* @__PURE__ */ R(N, { className: "h-7 w-7" })
143
+ }) : /* @__PURE__ */ R("ul", {
144
+ className: "space-y-2.5",
145
+ children: a.deliverables.map((e) => /* @__PURE__ */ R("li", {
146
+ className: "rounded-xl border border-border-seam bg-bg-canvas p-3.5 transition-colors hover:border-accent/40",
147
+ children: /* @__PURE__ */ z("div", {
148
+ className: "flex items-start justify-between gap-3",
149
+ children: [/* @__PURE__ */ z("div", {
150
+ className: "min-w-0",
151
+ children: [/* @__PURE__ */ z("div", {
152
+ className: "flex items-center gap-2 text-sm font-medium text-text-primary",
153
+ children: [/* @__PURE__ */ R("span", {
154
+ className: "truncate",
155
+ children: e.name
156
+ }), /* @__PURE__ */ z("span", {
157
+ className: "shrink-0 rounded-md bg-bg-sunken px-1.5 py-0.5 text-[10px] font-semibold text-text-tertiary",
134
158
  children: ["v", e.version]
135
- })
136
- ]
137
- }), e.dueDate && /* @__PURE__ */ I("div", {
138
- className: "text-xs text-text-tertiary",
139
- children: ["Due ", x(e.dueDate)]
140
- })] }), /* @__PURE__ */ F(V, {
159
+ })]
160
+ }), e.dueDate && /* @__PURE__ */ z("div", {
161
+ className: "mt-0.5 text-xs text-text-tertiary",
162
+ children: ["Due ", x(e.dueDate)]
163
+ })]
164
+ }), /* @__PURE__ */ R(W, {
141
165
  id: e.id,
142
- engagementId: n.id,
166
+ engagementId: a.id,
143
167
  status: e.status,
144
- onDone: () => void m()
168
+ onDone: () => void h()
145
169
  })]
146
170
  })
147
171
  }, e.id))
148
172
  })
149
- }), /* @__PURE__ */ F(_, {
173
+ }), /* @__PURE__ */ R(_, {
150
174
  title: "Milestones",
151
- action: /* @__PURE__ */ I(L, {
175
+ action: /* @__PURE__ */ z(B, {
152
176
  size: "sm",
153
177
  variant: "outline",
154
- onClick: () => z(!0),
155
- children: [/* @__PURE__ */ F(M, { className: "mr-1.5 h-4 w-4" }), "Add"]
178
+ onClick: () => U(!0),
179
+ children: [/* @__PURE__ */ R(F, { className: "mr-1.5 h-4 w-4" }), "Add"]
156
180
  }),
157
- children: n.milestones.length === 0 ? /* @__PURE__ */ F(l, {
181
+ children: a.milestones.length === 0 ? /* @__PURE__ */ R(l, {
158
182
  title: "No milestones",
159
183
  description: "Add checkpoints — some can trigger billing.",
160
- icon: /* @__PURE__ */ F(j, { className: "h-7 w-7" })
161
- }) : /* @__PURE__ */ F("ul", {
162
- className: "space-y-2",
163
- children: n.milestones.map((e) => /* @__PURE__ */ I("li", {
164
- className: "flex items-center justify-between rounded-lg border border-border-seam p-3",
165
- children: [/* @__PURE__ */ I("div", { children: [/* @__PURE__ */ F("div", {
166
- className: "text-sm font-medium text-text-primary",
167
- children: e.name
168
- }), /* @__PURE__ */ I("div", {
169
- className: "text-xs text-text-tertiary",
170
- children: [
171
- e.triggersInvoice ? `Bills ${C(e.triggerAmount, n.currency)} · ` : "",
172
- "Due ",
173
- x(e.dueDate)
174
- ]
175
- })] }), /* @__PURE__ */ I("div", {
176
- className: "flex items-center gap-2",
177
- children: [/* @__PURE__ */ F(v, { status: e.status }), e.status !== "COMPLETED" && e.status !== "CANCELLED" && /* @__PURE__ */ F(H, {
184
+ icon: /* @__PURE__ */ R(P, { className: "h-7 w-7" })
185
+ }) : /* @__PURE__ */ R("ul", {
186
+ className: "space-y-2.5",
187
+ children: a.milestones.map((e) => /* @__PURE__ */ z("li", {
188
+ className: "flex items-center justify-between gap-3 rounded-xl border border-border-seam bg-bg-canvas p-3.5 transition-colors hover:border-accent/40",
189
+ children: [/* @__PURE__ */ z("div", {
190
+ className: "min-w-0",
191
+ children: [/* @__PURE__ */ R("div", {
192
+ className: "truncate text-sm font-medium text-text-primary",
193
+ children: e.name
194
+ }), /* @__PURE__ */ z("div", {
195
+ className: "mt-0.5 text-xs text-text-tertiary",
196
+ children: [
197
+ e.triggersInvoice ? `Bills ${C(e.triggerAmount, a.currency)} · ` : "",
198
+ "Due ",
199
+ x(e.dueDate)
200
+ ]
201
+ })]
202
+ }), /* @__PURE__ */ z("div", {
203
+ className: "flex shrink-0 items-center gap-2",
204
+ children: [/* @__PURE__ */ R(v, { status: e.status }), e.status !== "COMPLETED" && e.status !== "CANCELLED" && /* @__PURE__ */ R(G, {
178
205
  id: e.id,
179
- engagementId: n.id,
180
- onDone: () => void m()
206
+ engagementId: a.id,
207
+ onDone: () => void h()
181
208
  })]
182
209
  })]
183
210
  }, e.id))
184
211
  })
185
212
  })]
186
213
  }),
187
- /* @__PURE__ */ F(_, {
188
- title: "Time logged",
189
- action: /* @__PURE__ */ I(L, {
190
- size: "sm",
191
- variant: "outline",
192
- onClick: () => t("time"),
193
- children: [/* @__PURE__ */ F(k, { className: "mr-1.5 h-4 w-4" }), "Log time"]
194
- }),
195
- children: h.isLoading ? /* @__PURE__ */ F(f, { label: "Loading…" }) : !h.data || h.data.items.length === 0 ? /* @__PURE__ */ F(l, {
196
- title: "No time logged",
197
- description: "Time logged against this engagement will appear here."
198
- }) : /* @__PURE__ */ F("ul", {
199
- className: "divide-y divide-border-seam",
200
- children: h.data.items.slice(0, 8).map((e) => /* @__PURE__ */ I("li", {
201
- className: "flex items-center justify-between py-2 text-sm",
202
- children: [/* @__PURE__ */ I("span", {
203
- className: "text-text-secondary",
204
- children: [
205
- x(e.date),
206
- " · ",
207
- e.narrative || "Time entry"
208
- ]
209
- }), /* @__PURE__ */ I("span", {
210
- className: "flex items-center gap-2",
211
- children: [/* @__PURE__ */ F("span", {
212
- className: "text-text-primary",
213
- children: S(e.minutes)
214
- }), /* @__PURE__ */ F(v, { status: e.status })]
215
- })]
216
- }, e.id))
217
- })
218
- }),
219
- /* @__PURE__ */ F(T, {
220
- entityType: "proserviceworld-engagement",
221
- entityId: n.id
214
+ /* @__PURE__ */ z("div", {
215
+ className: "grid grid-cols-1 gap-4 lg:grid-cols-3",
216
+ children: [/* @__PURE__ */ R("div", {
217
+ className: "lg:col-span-2",
218
+ children: /* @__PURE__ */ R(T, {
219
+ entityType: "proserviceworld-engagement",
220
+ entityId: a.id
221
+ })
222
+ }), /* @__PURE__ */ R(_, {
223
+ title: "Time logged",
224
+ description: S(Z),
225
+ action: /* @__PURE__ */ z(B, {
226
+ size: "sm",
227
+ variant: "outline",
228
+ onClick: () => t("time"),
229
+ children: [/* @__PURE__ */ R(j, { className: "mr-1.5 h-4 w-4" }), "Log time"]
230
+ }),
231
+ children: y.isLoading ? /* @__PURE__ */ R(f, { label: "Loading…" }) : !y.data || y.data.items.length === 0 ? /* @__PURE__ */ R(l, {
232
+ title: "No time logged",
233
+ description: "Time logged against this engagement will appear here.",
234
+ icon: /* @__PURE__ */ R(j, { className: "h-7 w-7" })
235
+ }) : /* @__PURE__ */ R("ul", {
236
+ className: "space-y-2",
237
+ children: y.data.items.slice(0, 8).map((e) => /* @__PURE__ */ z("li", {
238
+ className: "rounded-lg border border-border-seam bg-bg-canvas p-3 text-sm",
239
+ children: [/* @__PURE__ */ z("div", {
240
+ className: "flex items-center justify-between gap-2",
241
+ children: [/* @__PURE__ */ R("span", {
242
+ className: "whitespace-nowrap text-xs text-text-tertiary",
243
+ children: x(e.date)
244
+ }), /* @__PURE__ */ z("span", {
245
+ className: "flex items-center gap-2",
246
+ children: [/* @__PURE__ */ R("span", {
247
+ className: "font-medium text-text-primary",
248
+ children: S(e.minutes)
249
+ }), /* @__PURE__ */ R(v, { status: e.status })]
250
+ })]
251
+ }), /* @__PURE__ */ R("div", {
252
+ className: "mt-1 truncate text-text-secondary",
253
+ children: e.narrative || "Time entry"
254
+ })]
255
+ }, e.id))
256
+ })
257
+ })]
222
258
  }),
223
- b && /* @__PURE__ */ F(U, {
224
- engagementId: n.id,
225
- onClose: () => O(!1),
259
+ A && /* @__PURE__ */ R(K, {
260
+ engagementId: a.id,
261
+ onClose: () => L(!1),
226
262
  onDone: () => {
227
- m(), G({
263
+ h(), Y({
228
264
  tone: "success",
229
265
  text: "Deliverable added."
230
266
  });
231
267
  }
232
268
  }),
233
- P && /* @__PURE__ */ F(W, {
234
- engagementId: n.id,
235
- onClose: () => z(!1),
269
+ H && /* @__PURE__ */ R(q, {
270
+ engagementId: a.id,
271
+ onClose: () => U(!1),
236
272
  onDone: () => {
237
- m(), G({
273
+ h(), Y({
238
274
  tone: "success",
239
275
  text: "Milestone added."
240
276
  });
@@ -242,9 +278,9 @@ var R = {
242
278
  })
243
279
  ]
244
280
  });
245
- }, V = ({ id: e, engagementId: t, status: n, onDone: r }) => {
281
+ }, W = ({ id: e, engagementId: t, status: n, onDone: r }) => {
246
282
  let i = a();
247
- return /* @__PURE__ */ F(h, {
283
+ return /* @__PURE__ */ R(h, {
248
284
  value: n,
249
285
  disabled: i.isPending,
250
286
  onChange: (n) => i.mutate({
@@ -252,15 +288,15 @@ var R = {
252
288
  status: n.target.value,
253
289
  engagementId: t
254
290
  }, { onSuccess: r }),
255
- className: "w-40",
256
- children: z.map((e) => /* @__PURE__ */ F("option", {
291
+ className: "w-40 shrink-0",
292
+ children: H.map((e) => /* @__PURE__ */ R("option", {
257
293
  value: e,
258
294
  children: w(e)
259
295
  }, e))
260
296
  });
261
- }, H = ({ id: t, engagementId: n, onDone: r }) => {
297
+ }, G = ({ id: t, engagementId: n, onDone: r }) => {
262
298
  let i = e();
263
- return /* @__PURE__ */ F(L, {
299
+ return /* @__PURE__ */ R(B, {
264
300
  variant: "ghost",
265
301
  size: "sm",
266
302
  "aria-label": "Complete milestone",
@@ -269,28 +305,28 @@ var R = {
269
305
  id: t,
270
306
  engagementId: n
271
307
  }, { onSuccess: r }),
272
- children: /* @__PURE__ */ F(O, { className: "h-4 w-4" })
308
+ children: /* @__PURE__ */ R(A, { className: "h-4 w-4" })
273
309
  });
274
- }, U = ({ engagementId: e, onClose: n, onDone: r }) => {
275
- let i = t(), [a, o] = E({
310
+ }, K = ({ engagementId: e, onClose: n, onDone: r }) => {
311
+ let i = t(), [a, o] = D({
276
312
  name: "",
277
313
  description: "",
278
314
  dueDate: "",
279
315
  acceptanceCriteria: ""
280
- }), [s, l] = E(null), u = (e) => (t) => o((n) => ({
316
+ }), [s, l] = D(null), u = (e) => (t) => o((n) => ({
281
317
  ...n,
282
318
  [e]: t.target.value
283
319
  }));
284
- return /* @__PURE__ */ F(m, {
320
+ return /* @__PURE__ */ R(m, {
285
321
  open: !0,
286
322
  onClose: n,
287
323
  title: "Add deliverable",
288
- footer: /* @__PURE__ */ I(P, { children: [/* @__PURE__ */ F(L, {
324
+ footer: /* @__PURE__ */ z(L, { children: [/* @__PURE__ */ R(B, {
289
325
  variant: "outline",
290
326
  onClick: n,
291
327
  disabled: i.isPending,
292
328
  children: "Cancel"
293
- }), /* @__PURE__ */ F(L, {
329
+ }), /* @__PURE__ */ R(B, {
294
330
  onClick: () => {
295
331
  if (l(null), !a.name.trim()) return l("Name is required.");
296
332
  i.mutate({
@@ -309,40 +345,40 @@ var R = {
309
345
  disabled: i.isPending,
310
346
  children: i.isPending ? "Adding…" : "Add"
311
347
  })] }),
312
- children: /* @__PURE__ */ I("div", {
348
+ children: /* @__PURE__ */ z("div", {
313
349
  className: "space-y-3",
314
350
  children: [
315
- s && /* @__PURE__ */ F(c, {
351
+ s && /* @__PURE__ */ R(c, {
316
352
  tone: "danger",
317
353
  children: s
318
354
  }),
319
- /* @__PURE__ */ F(d, {
355
+ /* @__PURE__ */ R(d, {
320
356
  label: "Name",
321
357
  required: !0,
322
- children: /* @__PURE__ */ F(b, {
358
+ children: /* @__PURE__ */ R(b, {
323
359
  value: a.name,
324
360
  onChange: u("name"),
325
361
  placeholder: "Draft audit report"
326
362
  })
327
363
  }),
328
- /* @__PURE__ */ F(d, {
364
+ /* @__PURE__ */ R(d, {
329
365
  label: "Due date",
330
- children: /* @__PURE__ */ F(b, {
366
+ children: /* @__PURE__ */ R(b, {
331
367
  type: "date",
332
368
  value: a.dueDate,
333
369
  onChange: u("dueDate")
334
370
  })
335
371
  }),
336
- /* @__PURE__ */ F(d, {
372
+ /* @__PURE__ */ R(d, {
337
373
  label: "Acceptance criteria",
338
- children: /* @__PURE__ */ F(y, {
374
+ children: /* @__PURE__ */ R(y, {
339
375
  value: a.acceptanceCriteria,
340
376
  onChange: u("acceptanceCriteria")
341
377
  })
342
378
  }),
343
- /* @__PURE__ */ F(d, {
379
+ /* @__PURE__ */ R(d, {
344
380
  label: "Description",
345
- children: /* @__PURE__ */ F(y, {
381
+ children: /* @__PURE__ */ R(y, {
346
382
  value: a.description,
347
383
  onChange: u("description")
348
384
  })
@@ -350,23 +386,23 @@ var R = {
350
386
  ]
351
387
  })
352
388
  });
353
- }, W = ({ engagementId: e, onClose: t, onDone: r }) => {
354
- let i = n(), [a, o] = E({
389
+ }, q = ({ engagementId: e, onClose: t, onDone: r }) => {
390
+ let i = n(), [a, o] = D({
355
391
  name: "",
356
392
  dueDate: "",
357
393
  triggerAmount: "",
358
394
  triggersInvoice: !1
359
- }), [s, l] = E(null);
360
- return /* @__PURE__ */ F(m, {
395
+ }), [s, l] = D(null);
396
+ return /* @__PURE__ */ R(m, {
361
397
  open: !0,
362
398
  onClose: t,
363
399
  title: "Add milestone",
364
- footer: /* @__PURE__ */ I(P, { children: [/* @__PURE__ */ F(L, {
400
+ footer: /* @__PURE__ */ z(L, { children: [/* @__PURE__ */ R(B, {
365
401
  variant: "outline",
366
402
  onClick: t,
367
403
  disabled: i.isPending,
368
404
  children: "Cancel"
369
- }), /* @__PURE__ */ F(L, {
405
+ }), /* @__PURE__ */ R(B, {
370
406
  onClick: () => {
371
407
  if (l(null), !a.name.trim()) return l("Name is required.");
372
408
  i.mutate({
@@ -385,17 +421,17 @@ var R = {
385
421
  disabled: i.isPending,
386
422
  children: i.isPending ? "Adding…" : "Add"
387
423
  })] }),
388
- children: /* @__PURE__ */ I("div", {
424
+ children: /* @__PURE__ */ z("div", {
389
425
  className: "space-y-3",
390
426
  children: [
391
- s && /* @__PURE__ */ F(c, {
427
+ s && /* @__PURE__ */ R(c, {
392
428
  tone: "danger",
393
429
  children: s
394
430
  }),
395
- /* @__PURE__ */ F(d, {
431
+ /* @__PURE__ */ R(d, {
396
432
  label: "Name",
397
433
  required: !0,
398
- children: /* @__PURE__ */ F(b, {
434
+ children: /* @__PURE__ */ R(b, {
399
435
  value: a.name,
400
436
  onChange: (e) => o((t) => ({
401
437
  ...t,
@@ -404,9 +440,9 @@ var R = {
404
440
  placeholder: "Phase 1 sign-off"
405
441
  })
406
442
  }),
407
- /* @__PURE__ */ F(d, {
443
+ /* @__PURE__ */ R(d, {
408
444
  label: "Due date",
409
- children: /* @__PURE__ */ F(b, {
445
+ children: /* @__PURE__ */ R(b, {
410
446
  type: "date",
411
447
  value: a.dueDate,
412
448
  onChange: (e) => o((t) => ({
@@ -415,10 +451,10 @@ var R = {
415
451
  }))
416
452
  })
417
453
  }),
418
- /* @__PURE__ */ F(d, {
454
+ /* @__PURE__ */ R(d, {
419
455
  label: "Trigger amount",
420
456
  hint: "Amount billed when this milestone completes (if it triggers an invoice).",
421
- children: /* @__PURE__ */ F(b, {
457
+ children: /* @__PURE__ */ R(b, {
422
458
  type: "number",
423
459
  min: "0",
424
460
  value: a.triggerAmount,
@@ -428,9 +464,9 @@ var R = {
428
464
  }))
429
465
  })
430
466
  }),
431
- /* @__PURE__ */ I("label", {
467
+ /* @__PURE__ */ z("label", {
432
468
  className: "flex items-center gap-2 text-sm text-text-secondary",
433
- children: [/* @__PURE__ */ F("input", {
469
+ children: [/* @__PURE__ */ R("input", {
434
470
  type: "checkbox",
435
471
  checked: a.triggersInvoice,
436
472
  onChange: (e) => o((t) => ({
@@ -444,6 +480,6 @@ var R = {
444
480
  });
445
481
  };
446
482
  //#endregion
447
- export { B as EngagementDetailPage };
483
+ export { U as EngagementDetailPage };
448
484
 
449
485
  //# sourceMappingURL=EngagementDetailPage.js.map