@burdenoff/microfe-hookmovies 2026.706.2 → 2026.706.4

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 (62) hide show
  1. package/dist/hookmovies/HookMoviesRoutes.js +54 -6
  2. package/dist/hookmovies/HookMoviesRoutes.js.map +1 -1
  3. package/dist/hookmovies/components/index.js +1 -1
  4. package/dist/hookmovies/context/HookMoviesContext.js +64 -40
  5. package/dist/hookmovies/context/HookMoviesContext.js.map +1 -1
  6. package/dist/hookmovies/hooks/useHookMoviesApi.js +592 -134
  7. package/dist/hookmovies/hooks/useHookMoviesApi.js.map +1 -1
  8. package/dist/hookmovies/pages/HomePage.js +211 -139
  9. package/dist/hookmovies/pages/HomePage.js.map +1 -1
  10. package/dist/hookmovies/pages/ai/ConciergePage.js +330 -0
  11. package/dist/hookmovies/pages/ai/ConciergePage.js.map +1 -0
  12. package/dist/hookmovies/pages/analytics/AnalyticsPage.js +450 -0
  13. package/dist/hookmovies/pages/analytics/AnalyticsPage.js.map +1 -0
  14. package/dist/hookmovies/pages/analytics/PayoutsPage.js +499 -0
  15. package/dist/hookmovies/pages/analytics/PayoutsPage.js.map +1 -0
  16. package/dist/hookmovies/pages/auditions/AuditionDetailPage.js +223 -140
  17. package/dist/hookmovies/pages/auditions/AuditionDetailPage.js.map +1 -1
  18. package/dist/hookmovies/pages/auditions/AuditionsPage.js +161 -83
  19. package/dist/hookmovies/pages/auditions/AuditionsPage.js.map +1 -1
  20. package/dist/hookmovies/pages/catalog/PeoplePage.js +177 -103
  21. package/dist/hookmovies/pages/catalog/PeoplePage.js.map +1 -1
  22. package/dist/hookmovies/pages/catalog/StudiosPage.js +191 -108
  23. package/dist/hookmovies/pages/catalog/StudiosPage.js.map +1 -1
  24. package/dist/hookmovies/pages/catalog/TitleDetailPage.js +744 -622
  25. package/dist/hookmovies/pages/catalog/TitleDetailPage.js.map +1 -1
  26. package/dist/hookmovies/pages/catalog/TitlesPage.js +218 -138
  27. package/dist/hookmovies/pages/catalog/TitlesPage.js.map +1 -1
  28. package/dist/hookmovies/pages/commerce/CheckoutPage.js +430 -0
  29. package/dist/hookmovies/pages/commerce/CheckoutPage.js.map +1 -0
  30. package/dist/hookmovies/pages/consumer/DiscoveryPage.js +21 -21
  31. package/dist/hookmovies/pages/consumer/HooksPage.js +5 -5
  32. package/dist/hookmovies/pages/consumer/TitleViewPage.js +32 -32
  33. package/dist/hookmovies/pages/consumer/TitleViewPage.js.map +1 -1
  34. package/dist/hookmovies/pages/developer/DevPortalPage.js +815 -0
  35. package/dist/hookmovies/pages/developer/DevPortalPage.js.map +1 -0
  36. package/dist/hookmovies/pages/distribution/RightsWindowsPage.js +235 -162
  37. package/dist/hookmovies/pages/distribution/RightsWindowsPage.js.map +1 -1
  38. package/dist/hookmovies/pages/engagement/ReviewsPage.js +201 -143
  39. package/dist/hookmovies/pages/engagement/ReviewsPage.js.map +1 -1
  40. package/dist/hookmovies/pages/library/EntitlementsPage.js +447 -221
  41. package/dist/hookmovies/pages/library/EntitlementsPage.js.map +1 -1
  42. package/dist/hookmovies/pages/library/ListsPage.js +243 -167
  43. package/dist/hookmovies/pages/library/ListsPage.js.map +1 -1
  44. package/dist/hookmovies/pages/live/LivePage.js +608 -0
  45. package/dist/hookmovies/pages/live/LivePage.js.map +1 -0
  46. package/dist/hookmovies/pages/localization/LocalizationPage.js +656 -0
  47. package/dist/hookmovies/pages/localization/LocalizationPage.js.map +1 -0
  48. package/dist/hookmovies/pages/onboarding/OnboardingPage.js +366 -0
  49. package/dist/hookmovies/pages/onboarding/OnboardingPage.js.map +1 -0
  50. package/dist/hookmovies/pages/productions/ProductionDetailPage.js +265 -179
  51. package/dist/hookmovies/pages/productions/ProductionDetailPage.js.map +1 -1
  52. package/dist/hookmovies/pages/productions/ProductionsPage.js +264 -71
  53. package/dist/hookmovies/pages/productions/ProductionsPage.js.map +1 -1
  54. package/dist/hookmovies/pages/social/ProfilesPage.js +701 -0
  55. package/dist/hookmovies/pages/social/ProfilesPage.js.map +1 -0
  56. package/dist/hookmovies/pages/social/WatchPartyListPage.js +281 -0
  57. package/dist/hookmovies/pages/social/WatchPartyListPage.js.map +1 -0
  58. package/dist/hookmovies/pages/social/WatchPartyRoomPage.js +567 -0
  59. package/dist/hookmovies/pages/social/WatchPartyRoomPage.js.map +1 -0
  60. package/dist/hookmovies/pages/trust/ModerationPage.js +320 -0
  61. package/dist/hookmovies/pages/trust/ModerationPage.js.map +1 -0
  62. package/package.json +1 -1
@@ -1,234 +1,320 @@
1
1
  import { useHookMovies as e } from "../../context/HookMoviesContext.js";
2
- import { PageLayout as t } from "../../components/PageLayout.js";
3
- import { StatusBadge as n } from "../../components/StatusBadge.js";
4
- import { useProduction as r, useTransitionProduction as i } from "../../hooks/useHookMoviesApi.js";
5
- import { formatDate as a, formatEnumLabel as o, formatMinorUnits as s } from "../../utils/formatters.js";
6
- import { ErrorState as c, LoadingState as l } from "../../components/StateViews.js";
7
- import { useState as u } from "react";
8
- import { ArrowLeft as d, ArrowRight as f, Calendar as p, Coins as m, Link2 as h, Megaphone as g, Plus as _ } from "lucide-react";
9
- import { useParams as v } from "react-router-dom";
10
- import { jsx as y, jsxs as b } from "react/jsx-runtime";
11
- import { GlassCard as x } from "@burdenoff/fe-libs/ui";
2
+ import { cn as t } from "../../utils/cn.js";
3
+ import { PageLayout as n } from "../../components/PageLayout.js";
4
+ import { StatusBadge as r } from "../../components/StatusBadge.js";
5
+ import { useProduction as i, useTransitionProduction as a } from "../../hooks/useHookMoviesApi.js";
6
+ import { formatDate as o, formatEnumLabel as s, formatMinorUnits as c } from "../../utils/formatters.js";
7
+ import { EmptyState as l } from "../../components/EmptyState.js";
8
+ import { ErrorState as u, LoadingState as d } from "../../components/StateViews.js";
9
+ import { useState as f } from "react";
10
+ import { Archive as p, ArrowLeft as m, ArrowRight as h, Calendar as g, CheckCircle2 as _, Clapperboard as v, Coins as y, Lightbulb as b, Link2 as x, MapPin as S, Megaphone as C, Plus as w, Scissors as T, Sparkles as E, Wallet as D } from "lucide-react";
11
+ import { useParams as O } from "react-router-dom";
12
+ import { jsx as k, jsxs as A } from "react/jsx-runtime";
13
+ import { GlassCard as j } from "@burdenoff/fe-libs/ui";
12
14
  //#region src/hookmovies/pages/productions/ProductionDetailPage.tsx
13
- var S = {
15
+ var M = {
14
16
  DEVELOPMENT: ["GREENLIT", "SHELVED"],
15
17
  GREENLIT: ["IN_PRODUCTION", "SHELVED"],
16
18
  IN_PRODUCTION: ["POST_PRODUCTION", "SHELVED"],
17
19
  POST_PRODUCTION: ["RELEASED", "SHELVED"],
18
20
  RELEASED: [],
19
21
  SHELVED: ["DEVELOPMENT"]
20
- }, C = () => {
21
- let { id: C } = v(), { navigateTo: w } = e(), { data: T, isLoading: E, isError: D, refetch: O } = r(C), k = i(), [A, j] = u(null);
22
- if (E) return /* @__PURE__ */ y(t, {
22
+ }, N = [
23
+ "DEVELOPMENT",
24
+ "GREENLIT",
25
+ "IN_PRODUCTION",
26
+ "POST_PRODUCTION",
27
+ "RELEASED"
28
+ ], P = {
29
+ DEVELOPMENT: b,
30
+ GREENLIT: _,
31
+ IN_PRODUCTION: v,
32
+ POST_PRODUCTION: T,
33
+ RELEASED: E,
34
+ SHELVED: p
35
+ }, F = () => {
36
+ let { id: _ } = O(), { navigateTo: b } = e(), { data: T, isLoading: E, isError: F, refetch: I } = i(_), L = a(), [R, z] = f(null);
37
+ if (E) return /* @__PURE__ */ k(n, {
23
38
  title: "Production",
24
- children: /* @__PURE__ */ y(l, { label: "Loading production…" })
39
+ children: /* @__PURE__ */ k(d, { label: "Loading production…" })
25
40
  });
26
- if (D || !T) return /* @__PURE__ */ y(t, {
41
+ if (F || !T) return /* @__PURE__ */ k(n, {
27
42
  title: "Production",
28
- children: /* @__PURE__ */ y(c, {
43
+ children: /* @__PURE__ */ k(u, {
29
44
  title: "Production not found",
30
- onRetry: () => void O()
45
+ onRetry: () => void I()
31
46
  })
32
47
  });
33
- let M = async (e) => {
34
- j(null);
48
+ let B = async (e) => {
49
+ z(null);
35
50
  try {
36
- await k.mutateAsync({
51
+ await L.mutateAsync({
37
52
  id: T.id,
38
53
  status: e
39
54
  });
40
55
  } catch (e) {
41
- j(e instanceof Error ? e.message : "Transition failed");
56
+ z(e instanceof Error ? e.message : "Transition failed");
42
57
  }
43
- };
44
- return /* @__PURE__ */ b(t, {
45
- title: /* @__PURE__ */ b("span", {
58
+ }, V = M[T.status], H = T.status === "SHELVED", U = N.indexOf(T.status);
59
+ return /* @__PURE__ */ A(n, {
60
+ title: /* @__PURE__ */ A("span", {
46
61
  className: "flex items-center gap-3",
47
- children: [/* @__PURE__ */ y("button", {
62
+ children: [/* @__PURE__ */ k("button", {
48
63
  type: "button",
49
- onClick: () => w("productions"),
50
- className: "rounded-md p-1 text-text-secondary hover:text-text-primary",
64
+ onClick: () => b("productions"),
65
+ className: "rounded-md p-1 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg",
51
66
  "aria-label": "Back to productions",
52
- children: /* @__PURE__ */ y(d, { className: "h-5 w-5" })
67
+ children: /* @__PURE__ */ k(m, { className: "h-5 w-5" })
53
68
  }), T.title]
54
69
  }),
55
70
  description: T.logline ?? "Production",
56
- actions: /* @__PURE__ */ y(n, { status: T.status }),
57
- children: [A && /* @__PURE__ */ y("div", {
58
- className: "mb-4 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text",
59
- children: A
60
- }), /* @__PURE__ */ b("div", {
61
- className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
62
- children: [/* @__PURE__ */ b("div", {
63
- className: "space-y-6 lg:col-span-2",
64
- children: [T.synopsis && /* @__PURE__ */ b(x, {
65
- treatment: "metric",
66
- className: "border-border-seam p-5",
67
- children: [/* @__PURE__ */ y("h2", {
68
- className: "mb-2 text-sm font-semibold text-text-primary",
69
- children: "Synopsis"
70
- }), /* @__PURE__ */ y("p", {
71
- className: "text-sm leading-relaxed text-text-secondary",
72
- children: T.synopsis
73
- })]
74
- }), /* @__PURE__ */ b(x, {
75
- treatment: "metric",
76
- className: "border-border-seam p-5",
77
- children: [/* @__PURE__ */ b("div", {
78
- className: "mb-3 flex items-center justify-between",
79
- children: [/* @__PURE__ */ b("h2", {
80
- className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
81
- children: [
82
- /* @__PURE__ */ y(g, { className: "h-4 w-4" }),
83
- "Auditions (",
84
- T.auditions.length,
85
- ")"
86
- ]
87
- }), /* @__PURE__ */ b("button", {
88
- type: "button",
89
- onClick: () => w(`auditions/new?productionId=${T.id}`),
90
- className: "inline-flex items-center gap-1 rounded-lg border border-border-seam px-2.5 py-1 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors",
91
- children: [/* @__PURE__ */ y(_, { className: "h-3.5 w-3.5" }), "Post Role"]
71
+ actions: /* @__PURE__ */ A("div", {
72
+ className: "flex flex-wrap items-center gap-2",
73
+ children: [/* @__PURE__ */ k(r, { status: T.status }), /* @__PURE__ */ A("button", {
74
+ type: "button",
75
+ onClick: () => b(`auditions/new?productionId=${T.id}`),
76
+ className: "inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg focus-visible:ring-offset-2 focus-visible:ring-offset-bg-canvas",
77
+ children: [/* @__PURE__ */ k(w, { className: "h-3.5 w-3.5" }), "Post Role"]
78
+ })]
79
+ }),
80
+ children: [R && /* @__PURE__ */ k("div", {
81
+ role: "alert",
82
+ className: "mb-6 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-2.5 text-sm text-status-error-text",
83
+ children: R
84
+ }), /* @__PURE__ */ A("div", {
85
+ className: "space-y-6",
86
+ children: [/* @__PURE__ */ A(j, {
87
+ treatment: "metric",
88
+ className: "border-border-seam p-5 sm:p-6",
89
+ children: [
90
+ /* @__PURE__ */ A("div", {
91
+ className: "mb-5 flex items-center gap-2",
92
+ children: [/* @__PURE__ */ k(v, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ k("h2", {
93
+ className: "text-sm font-semibold text-text-primary",
94
+ children: "Advance Lifecycle"
92
95
  })]
93
- }), T.auditions.length === 0 ? /* @__PURE__ */ y("p", {
94
- className: "text-sm text-text-secondary",
95
- children: "No open audition roles for this production."
96
- }) : /* @__PURE__ */ y("ul", {
97
- className: "divide-y divide-border-seam",
98
- children: T.auditions.map((e) => /* @__PURE__ */ y("li", { children: /* @__PURE__ */ b("button", {
99
- type: "button",
100
- onClick: () => w(`auditions/${e.id}`),
101
- className: "flex w-full items-center justify-between gap-3 py-3 text-left hover:bg-bg-sunken transition-colors",
102
- children: [/* @__PURE__ */ b("div", {
103
- className: "min-w-0",
104
- children: [/* @__PURE__ */ b("p", {
105
- className: "truncate text-sm font-medium text-text-primary",
106
- children: [e.roleName, e.isMinorRole && /* @__PURE__ */ y("span", {
107
- className: "ml-2 rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-[10px] text-status-warning-text",
108
- children: "Minor role"
96
+ }),
97
+ /* @__PURE__ */ k("ol", {
98
+ className: "flex items-stretch gap-1.5 overflow-x-auto pb-1 sm:gap-2",
99
+ "aria-label": "Production lifecycle progress",
100
+ children: N.map((e, n) => {
101
+ let r = P[e], i = U === -1 ? "upcoming" : n < U ? "complete" : n === U ? "current" : "upcoming";
102
+ return /* @__PURE__ */ k("li", {
103
+ className: "min-w-[7rem] flex-1",
104
+ "aria-current": i === "current",
105
+ children: /* @__PURE__ */ A("div", {
106
+ className: t("flex h-full flex-col gap-2 rounded-lg border px-3 py-2.5 transition-colors", i === "current" && "border-action-primary-bg bg-action-primary-bg/10 text-text-primary", i === "complete" && "border-status-success-border bg-status-success-bg-subtle text-status-success-text", i === "upcoming" && "border-border-seam bg-bg-sunken/40 text-text-secondary"),
107
+ children: [/* @__PURE__ */ A("div", {
108
+ className: "flex items-center justify-between",
109
+ children: [/* @__PURE__ */ k(r, { className: "h-4 w-4" }), /* @__PURE__ */ k("span", {
110
+ className: "text-[10px] font-medium uppercase tracking-wide opacity-70",
111
+ children: String(n + 1).padStart(2, "0")
112
+ })]
113
+ }), /* @__PURE__ */ k("span", {
114
+ className: "text-xs font-semibold leading-tight",
115
+ children: s(e)
109
116
  })]
110
- }), /* @__PURE__ */ b("p", {
111
- className: "text-xs text-text-secondary",
112
- children: [s(e.payMinorUnits, e.currency), e.location ? ` · ${e.location}` : ""]
113
- })]
114
- }), /* @__PURE__ */ b("div", {
115
- className: "flex items-center gap-2",
116
- children: [/* @__PURE__ */ y(n, { status: e.status }), /* @__PURE__ */ y(f, { className: "h-4 w-4 text-text-secondary" })]
117
+ })
118
+ }, e);
119
+ })
120
+ }),
121
+ H && /* @__PURE__ */ A("div", {
122
+ className: "mt-4 flex items-center gap-2 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-2 text-xs text-status-error-text",
123
+ children: [/* @__PURE__ */ k(p, { className: "h-3.5 w-3.5" }), "This production is shelved and off the active pipeline."]
124
+ }),
125
+ /* @__PURE__ */ k("div", {
126
+ className: "mt-5 border-t border-border-seam pt-4",
127
+ children: V.length === 0 ? /* @__PURE__ */ k("p", {
128
+ className: "text-xs text-text-secondary",
129
+ children: "This production has reached the end of its lifecycle — no further transitions available."
130
+ }) : /* @__PURE__ */ A("div", {
131
+ className: "flex flex-col gap-3 sm:flex-row sm:items-center",
132
+ children: [/* @__PURE__ */ k("span", {
133
+ className: "text-xs font-medium text-text-secondary",
134
+ children: "Move to"
135
+ }), /* @__PURE__ */ k("div", {
136
+ className: "flex flex-wrap gap-2",
137
+ children: V.map((e) => {
138
+ let n = P[e], r = e === "SHELVED";
139
+ return /* @__PURE__ */ A("button", {
140
+ type: "button",
141
+ disabled: L.isPending,
142
+ onClick: () => void B(e),
143
+ className: t("inline-flex items-center gap-1.5 rounded-lg px-3.5 py-2 text-xs font-semibold transition-all disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-bg-canvas", r ? "border border-status-error-border text-status-error-text hover:bg-status-error-bg-subtle focus-visible:ring-status-error-border" : "bg-action-primary-bg text-action-primary-text hover:opacity-90 focus-visible:ring-action-primary-bg"),
144
+ children: [/* @__PURE__ */ k(n, { className: "h-3.5 w-3.5" }), s(e)]
145
+ }, e);
146
+ })
117
147
  })]
118
- }) }, e.id))
119
- })]
120
- })]
121
- }), /* @__PURE__ */ b("div", {
122
- className: "space-y-6",
123
- children: [
124
- /* @__PURE__ */ b(x, {
148
+ })
149
+ })
150
+ ]
151
+ }), /* @__PURE__ */ A("div", {
152
+ className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
153
+ children: [/* @__PURE__ */ A("div", {
154
+ className: "space-y-6 lg:col-span-2",
155
+ children: [T.synopsis && /* @__PURE__ */ A(j, {
125
156
  treatment: "metric",
126
- className: "border-border-seam p-5",
127
- children: [/* @__PURE__ */ y("h2", {
128
- className: "mb-3 text-sm font-semibold text-text-primary",
129
- children: "Advance Lifecycle"
130
- }), /* @__PURE__ */ b("div", {
131
- className: "flex flex-wrap gap-2",
132
- children: [S[T.status].map((e) => /* @__PURE__ */ y("button", {
133
- type: "button",
134
- disabled: k.isPending,
135
- onClick: () => void M(e),
136
- className: "rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50 transition-opacity",
137
- children: o(e)
138
- }, e)), S[T.status].length === 0 && /* @__PURE__ */ y("p", {
139
- className: "text-xs text-text-secondary",
140
- children: "No further transitions available."
141
- })]
157
+ className: "border-border-seam p-5 sm:p-6",
158
+ children: [/* @__PURE__ */ k("h2", {
159
+ className: "mb-2 text-sm font-semibold text-text-primary",
160
+ children: "Synopsis"
161
+ }), /* @__PURE__ */ k("p", {
162
+ className: "whitespace-pre-line text-sm leading-relaxed text-text-secondary",
163
+ children: T.synopsis
142
164
  })]
143
- }),
144
- /* @__PURE__ */ b(x, {
165
+ }), /* @__PURE__ */ A(j, {
145
166
  treatment: "metric",
146
- className: "border-border-seam p-5",
147
- children: [
148
- /* @__PURE__ */ y("h2", {
149
- className: "mb-3 text-sm font-semibold text-text-primary",
150
- children: "Details"
151
- }),
152
- /* @__PURE__ */ b("dl", {
153
- className: "space-y-2 text-sm",
167
+ className: "border-border-seam p-5 sm:p-6",
168
+ children: [/* @__PURE__ */ A("div", {
169
+ className: "mb-4 flex items-center justify-between gap-3",
170
+ children: [/* @__PURE__ */ A("h2", {
171
+ className: "flex items-center gap-2 text-sm font-semibold text-text-primary",
154
172
  children: [
155
- /* @__PURE__ */ b("div", {
156
- className: "flex items-center justify-between",
157
- children: [/* @__PURE__ */ b("dt", {
158
- className: "flex items-center gap-2 text-text-secondary",
159
- children: [/* @__PURE__ */ y(m, { className: "h-3.5 w-3.5" }), "Budget"]
160
- }), /* @__PURE__ */ y("dd", {
161
- className: "font-medium text-text-primary",
162
- children: s(T.budgetMinorUnits, T.currency)
163
- })]
164
- }),
165
- T.startDate && /* @__PURE__ */ b("div", {
166
- className: "flex items-center justify-between",
167
- children: [/* @__PURE__ */ b("dt", {
168
- className: "flex items-center gap-2 text-text-secondary",
169
- children: [/* @__PURE__ */ y(p, { className: "h-3.5 w-3.5" }), "Start"]
170
- }), /* @__PURE__ */ y("dd", {
171
- className: "font-medium text-text-primary",
172
- children: a(T.startDate, {
173
- hour: void 0,
174
- minute: void 0
175
- })
176
- })]
177
- }),
178
- T.endDate && /* @__PURE__ */ b("div", {
179
- className: "flex items-center justify-between",
180
- children: [/* @__PURE__ */ b("dt", {
181
- className: "flex items-center gap-2 text-text-secondary",
182
- children: [/* @__PURE__ */ y(p, { className: "h-3.5 w-3.5" }), "End"]
183
- }), /* @__PURE__ */ y("dd", {
184
- className: "font-medium text-text-primary",
185
- children: a(T.endDate, {
186
- hour: void 0,
187
- minute: void 0
188
- })
189
- })]
173
+ /* @__PURE__ */ k(C, { className: "h-4 w-4 text-text-secondary" }),
174
+ "Open Auditions / Casting",
175
+ /* @__PURE__ */ k("span", {
176
+ className: "rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary",
177
+ children: T.auditions.length
190
178
  })
191
179
  ]
192
- }),
193
- T.resultingTitleId && /* @__PURE__ */ b("button", {
180
+ }), /* @__PURE__ */ A("button", {
181
+ type: "button",
182
+ onClick: () => b(`auditions/new?productionId=${T.id}`),
183
+ className: "inline-flex shrink-0 items-center gap-1 rounded-lg border border-border-seam px-2.5 py-1 text-xs font-medium text-text-primary transition-colors hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg",
184
+ children: [/* @__PURE__ */ k(w, { className: "h-3.5 w-3.5" }), "Post Role"]
185
+ })]
186
+ }), T.auditions.length === 0 ? /* @__PURE__ */ k(l, {
187
+ title: "No open roles yet",
188
+ description: "Post a casting role to start collecting auditions for this production.",
189
+ action: /* @__PURE__ */ A("button", {
194
190
  type: "button",
195
- onClick: () => w(`catalog/titles/${T.resultingTitleId}`),
196
- className: "mt-3 inline-flex items-center gap-1 text-xs font-medium text-action-primary-bg hover:opacity-80",
197
- children: [/* @__PURE__ */ y(h, { className: "h-3.5 w-3.5" }), "View resulting title"]
191
+ onClick: () => b(`auditions/new?productionId=${T.id}`),
192
+ className: "inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg",
193
+ children: [/* @__PURE__ */ k(w, { className: "h-3.5 w-3.5" }), "Post Role"]
194
+ })
195
+ }) : /* @__PURE__ */ k("ul", {
196
+ className: "space-y-2",
197
+ children: T.auditions.map((e) => /* @__PURE__ */ k("li", { children: /* @__PURE__ */ A("button", {
198
+ type: "button",
199
+ onClick: () => b(`auditions/${e.id}`),
200
+ className: "group flex w-full items-center gap-3 rounded-lg border border-transparent px-3 py-3 text-left transition-colors hover:border-border-seam hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg",
201
+ children: [/* @__PURE__ */ A("div", {
202
+ className: "min-w-0 flex-1",
203
+ children: [/* @__PURE__ */ A("div", {
204
+ className: "flex flex-wrap items-center gap-2",
205
+ children: [/* @__PURE__ */ k("p", {
206
+ className: "truncate text-sm font-medium text-text-primary",
207
+ children: e.roleName
208
+ }), e.isMinorRole && /* @__PURE__ */ k("span", {
209
+ className: "rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-[10px] font-medium text-status-warning-text",
210
+ children: "Minor role"
211
+ })]
212
+ }), /* @__PURE__ */ A("p", {
213
+ className: "mt-1 flex flex-wrap items-center gap-x-3 gap-y-0.5 text-xs text-text-secondary",
214
+ children: [/* @__PURE__ */ A("span", {
215
+ className: "inline-flex items-center gap-1",
216
+ children: [/* @__PURE__ */ k(D, { className: "h-3 w-3" }), c(e.payMinorUnits, e.currency)]
217
+ }), e.location && /* @__PURE__ */ A("span", {
218
+ className: "inline-flex items-center gap-1",
219
+ children: [/* @__PURE__ */ k(S, { className: "h-3 w-3" }), e.location]
220
+ })]
221
+ })]
222
+ }), /* @__PURE__ */ A("div", {
223
+ className: "flex shrink-0 items-center gap-2",
224
+ children: [/* @__PURE__ */ k(r, { status: e.status }), /* @__PURE__ */ k(h, { className: "h-4 w-4 text-text-secondary transition-transform group-hover:translate-x-0.5" })]
225
+ })]
226
+ }) }, e.id))
227
+ })]
228
+ })]
229
+ }), /* @__PURE__ */ A("div", {
230
+ className: "space-y-6",
231
+ children: [/* @__PURE__ */ A(j, {
232
+ treatment: "metric",
233
+ className: "border-border-seam p-5 sm:p-6",
234
+ children: [
235
+ /* @__PURE__ */ k("h2", {
236
+ className: "mb-4 text-sm font-semibold text-text-primary",
237
+ children: "Facts"
198
238
  }),
199
- T.artistrybaseProjectRef && /* @__PURE__ */ b("p", {
200
- className: "mt-3 text-xs text-text-secondary",
239
+ /* @__PURE__ */ A("dl", {
240
+ className: "grid grid-cols-2 gap-x-4 gap-y-4",
201
241
  children: [
202
- "Promoted from Artistrybase project",
203
- " ",
204
- /* @__PURE__ */ y("span", {
205
- className: "font-mono",
206
- children: T.artistrybaseProjectRef
207
- })
242
+ /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ A("dt", {
243
+ className: "flex items-center gap-1.5 text-xs text-text-secondary",
244
+ children: [/* @__PURE__ */ k(y, { className: "h-3.5 w-3.5" }), "Budget"]
245
+ }), /* @__PURE__ */ k("dd", {
246
+ className: "mt-1 text-sm font-semibold text-text-primary",
247
+ children: c(T.budgetMinorUnits, T.currency)
248
+ })] }),
249
+ /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ k("dt", {
250
+ className: "text-xs text-text-secondary",
251
+ children: "Currency"
252
+ }), /* @__PURE__ */ k("dd", {
253
+ className: "mt-1 text-sm font-semibold text-text-primary",
254
+ children: T.currency
255
+ })] }),
256
+ T.startDate && /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ A("dt", {
257
+ className: "flex items-center gap-1.5 text-xs text-text-secondary",
258
+ children: [/* @__PURE__ */ k(g, { className: "h-3.5 w-3.5" }), "Start date"]
259
+ }), /* @__PURE__ */ k("dd", {
260
+ className: "mt-1 text-sm font-semibold text-text-primary",
261
+ children: o(T.startDate, {
262
+ hour: void 0,
263
+ minute: void 0
264
+ })
265
+ })] }),
266
+ T.endDate && /* @__PURE__ */ A("div", { children: [/* @__PURE__ */ A("dt", {
267
+ className: "flex items-center gap-1.5 text-xs text-text-secondary",
268
+ children: [/* @__PURE__ */ k(g, { className: "h-3.5 w-3.5" }), "End date"]
269
+ }), /* @__PURE__ */ k("dd", {
270
+ className: "mt-1 text-sm font-semibold text-text-primary",
271
+ children: o(T.endDate, {
272
+ hour: void 0,
273
+ minute: void 0
274
+ })
275
+ })] })
208
276
  ]
277
+ }),
278
+ (T.resultingTitleId || T.artistrybaseProjectRef) && /* @__PURE__ */ A("div", {
279
+ className: "mt-4 space-y-2 border-t border-border-seam pt-4",
280
+ children: [T.resultingTitleId && /* @__PURE__ */ A("button", {
281
+ type: "button",
282
+ onClick: () => b(`catalog/titles/${T.resultingTitleId}`),
283
+ className: "inline-flex items-center gap-1.5 text-xs font-semibold text-action-primary-bg transition-opacity hover:opacity-80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg rounded",
284
+ children: [/* @__PURE__ */ k(x, { className: "h-3.5 w-3.5" }), "View resulting title"]
285
+ }), T.artistrybaseProjectRef && /* @__PURE__ */ A("p", {
286
+ className: "text-xs text-text-secondary",
287
+ children: [
288
+ "Promoted from Artistrybase project",
289
+ " ",
290
+ /* @__PURE__ */ k("span", {
291
+ className: "font-mono text-text-primary",
292
+ children: T.artistrybaseProjectRef
293
+ })
294
+ ]
295
+ })]
209
296
  })
210
297
  ]
211
- }),
212
- T.tags.length > 0 && /* @__PURE__ */ b(x, {
298
+ }), T.tags.length > 0 && /* @__PURE__ */ A(j, {
213
299
  treatment: "metric",
214
- className: "border-border-seam p-5",
215
- children: [/* @__PURE__ */ y("h3", {
216
- className: "mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary",
300
+ className: "border-border-seam p-5 sm:p-6",
301
+ children: [/* @__PURE__ */ k("h3", {
302
+ className: "mb-3 text-xs font-semibold uppercase tracking-wide text-text-secondary",
217
303
  children: "Tags"
218
- }), /* @__PURE__ */ y("div", {
304
+ }), /* @__PURE__ */ k("div", {
219
305
  className: "flex flex-wrap gap-1.5",
220
- children: T.tags.map((e) => /* @__PURE__ */ y("span", {
306
+ children: T.tags.map((e) => /* @__PURE__ */ k("span", {
221
307
  className: "rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs text-text-secondary",
222
308
  children: e
223
309
  }, e))
224
310
  })]
225
- })
226
- ]
311
+ })]
312
+ })]
227
313
  })]
228
314
  })]
229
315
  });
230
316
  };
231
317
  //#endregion
232
- export { C as ProductionDetailPage };
318
+ export { F as ProductionDetailPage };
233
319
 
234
320
  //# sourceMappingURL=ProductionDetailPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductionDetailPage.js","names":[],"sources":["../../../../src/hookmovies/pages/productions/ProductionDetailPage.tsx"],"sourcesContent":["/**\n * Production detail (Production lifecycle)\n * @module hookmovies/pages/productions\n *\n * Reads one production via `hokProduction` (with auditions), advances its\n * lifecycle with `hokTransitionProduction`, and links into the casting auditions\n * the production owns.\n */\n\nimport { type FC, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { ArrowLeft, Calendar, Coins, Megaphone, ArrowRight, Link2, Plus } from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { LoadingState, ErrorState } from '../../components/StateViews';\nimport { useHookMovies } from '../../context/HookMoviesContext';\nimport {\n useProduction,\n useTransitionProduction,\n type HokProductionStatus,\n} from '../../hooks/useHookMoviesApi';\nimport { formatDate, formatEnumLabel, formatMinorUnits } from '../../utils/formatters';\n\nconst NEXT_STATUSES: Record<HokProductionStatus, HokProductionStatus[]> = {\n DEVELOPMENT: ['GREENLIT', 'SHELVED'],\n GREENLIT: ['IN_PRODUCTION', 'SHELVED'],\n IN_PRODUCTION: ['POST_PRODUCTION', 'SHELVED'],\n POST_PRODUCTION: ['RELEASED', 'SHELVED'],\n RELEASED: [],\n SHELVED: ['DEVELOPMENT'],\n};\n\nexport const ProductionDetailPage: FC = () => {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useHookMovies();\n const { data: production, isLoading, isError, refetch } = useProduction(id);\n const transition = useTransitionProduction();\n const [actionError, setActionError] = useState<string | null>(null);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Production\">\n <LoadingState label=\"Loading production…\" />\n </PageLayout>\n );\n }\n\n if (isError || !production) {\n return (\n <PageLayout title=\"Production\">\n <ErrorState title=\"Production not found\" onRetry={() => void refetch()} />\n </PageLayout>\n );\n }\n\n const handleTransition = async (status: HokProductionStatus) => {\n setActionError(null);\n try {\n await transition.mutateAsync({ id: production.id, status });\n } catch (err) {\n setActionError(err instanceof Error ? err.message : 'Transition failed');\n }\n };\n\n return (\n <PageLayout\n title={\n <span className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('productions')}\n className=\"rounded-md p-1 text-text-secondary hover:text-text-primary\"\n aria-label=\"Back to productions\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n {production.title}\n </span>\n }\n description={production.logline ?? 'Production'}\n actions={<StatusBadge status={production.status} />}\n >\n {actionError && (\n <div className=\"mb-4 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text\">\n {actionError}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"space-y-6 lg:col-span-2\">\n {production.synopsis && (\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-5\">\n <h2 className=\"mb-2 text-sm font-semibold text-text-primary\">Synopsis</h2>\n <p className=\"text-sm leading-relaxed text-text-secondary\">{production.synopsis}</p>\n </GlassCard>\n )}\n\n {/* Auditions */}\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-5\">\n <div className=\"mb-3 flex items-center justify-between\">\n <h2 className=\"flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Megaphone className=\"h-4 w-4\" />\n Auditions ({production.auditions.length})\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo(`auditions/new?productionId=${production.id}`)}\n className=\"inline-flex items-center gap-1 rounded-lg border border-border-seam px-2.5 py-1 text-xs font-medium text-text-primary hover:bg-bg-sunken transition-colors\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Post Role\n </button>\n </div>\n {production.auditions.length === 0 ? (\n <p className=\"text-sm text-text-secondary\">\n No open audition roles for this production.\n </p>\n ) : (\n <ul className=\"divide-y divide-border-seam\">\n {production.auditions.map((aud) => (\n <li key={aud.id}>\n <button\n type=\"button\"\n onClick={() => navigateTo(`auditions/${aud.id}`)}\n className=\"flex w-full items-center justify-between gap-3 py-3 text-left hover:bg-bg-sunken transition-colors\"\n >\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {aud.roleName}\n {aud.isMinorRole && (\n <span className=\"ml-2 rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-[10px] text-status-warning-text\">\n Minor role\n </span>\n )}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {formatMinorUnits(aud.payMinorUnits, aud.currency)}\n {aud.location ? ` · ${aud.location}` : ''}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <StatusBadge status={aud.status} />\n <ArrowRight className=\"h-4 w-4 text-text-secondary\" />\n </div>\n </button>\n </li>\n ))}\n </ul>\n )}\n </GlassCard>\n </div>\n\n <div className=\"space-y-6\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-5\">\n <h2 className=\"mb-3 text-sm font-semibold text-text-primary\">Advance Lifecycle</h2>\n <div className=\"flex flex-wrap gap-2\">\n {NEXT_STATUSES[production.status].map((status) => (\n <button\n key={status}\n type=\"button\"\n disabled={transition.isPending}\n onClick={() => void handleTransition(status)}\n className=\"rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50 transition-opacity\"\n >\n {formatEnumLabel(status)}\n </button>\n ))}\n {NEXT_STATUSES[production.status].length === 0 && (\n <p className=\"text-xs text-text-secondary\">No further transitions available.</p>\n )}\n </div>\n </GlassCard>\n\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-5\">\n <h2 className=\"mb-3 text-sm font-semibold text-text-primary\">Details</h2>\n <dl className=\"space-y-2 text-sm\">\n <div className=\"flex items-center justify-between\">\n <dt className=\"flex items-center gap-2 text-text-secondary\">\n <Coins className=\"h-3.5 w-3.5\" />\n Budget\n </dt>\n <dd className=\"font-medium text-text-primary\">\n {formatMinorUnits(production.budgetMinorUnits, production.currency)}\n </dd>\n </div>\n {production.startDate && (\n <div className=\"flex items-center justify-between\">\n <dt className=\"flex items-center gap-2 text-text-secondary\">\n <Calendar className=\"h-3.5 w-3.5\" />\n Start\n </dt>\n <dd className=\"font-medium text-text-primary\">\n {formatDate(production.startDate, { hour: undefined, minute: undefined })}\n </dd>\n </div>\n )}\n {production.endDate && (\n <div className=\"flex items-center justify-between\">\n <dt className=\"flex items-center gap-2 text-text-secondary\">\n <Calendar className=\"h-3.5 w-3.5\" />\n End\n </dt>\n <dd className=\"font-medium text-text-primary\">\n {formatDate(production.endDate, { hour: undefined, minute: undefined })}\n </dd>\n </div>\n )}\n </dl>\n\n {production.resultingTitleId && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`catalog/titles/${production.resultingTitleId}`)}\n className=\"mt-3 inline-flex items-center gap-1 text-xs font-medium text-action-primary-bg hover:opacity-80\"\n >\n <Link2 className=\"h-3.5 w-3.5\" />\n View resulting title\n </button>\n )}\n {production.artistrybaseProjectRef && (\n <p className=\"mt-3 text-xs text-text-secondary\">\n Promoted from Artistrybase project{' '}\n <span className=\"font-mono\">{production.artistrybaseProjectRef}</span>\n </p>\n )}\n </GlassCard>\n\n {production.tags.length > 0 && (\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-5\">\n <h3 className=\"mb-2 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n Tags\n </h3>\n <div className=\"flex flex-wrap gap-1.5\">\n {production.tags.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n </GlassCard>\n )}\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":";;;;;;;;;;;;AAwBA,IAAM,IAAoE;CACxE,aAAa,CAAC,YAAY,UAAU;CACpC,UAAU,CAAC,iBAAiB,UAAU;CACtC,eAAe,CAAC,mBAAmB,UAAU;CAC7C,iBAAiB,CAAC,YAAY,UAAU;CACxC,UAAU,EAAE;CACZ,SAAS,CAAC,cAAc;CACzB,EAEY,UAAiC;CAC5C,IAAM,EAAE,UAAO,GAA2B,EACpC,EAAE,kBAAe,GAAe,EAChC,EAAE,MAAM,GAAY,cAAW,YAAS,eAAY,EAAc,EAAG,EACrE,IAAa,GAAyB,EACtC,CAAC,GAAa,KAAkB,EAAwB,KAAK;AAEnE,KAAI,EACF,QACE,kBAAC,GAAD;EAAY,OAAM;YAChB,kBAAC,GAAD,EAAc,OAAM,uBAAwB,CAAA;EACjC,CAAA;AAIjB,KAAI,KAAW,CAAC,EACd,QACE,kBAAC,GAAD;EAAY,OAAM;YAChB,kBAAC,GAAD;GAAY,OAAM;GAAuB,eAAe,KAAK,GAAS;GAAI,CAAA;EAC/D,CAAA;CAIjB,IAAM,IAAmB,OAAO,MAAgC;AAC9D,IAAe,KAAK;AACpB,MAAI;AACF,SAAM,EAAW,YAAY;IAAE,IAAI,EAAW;IAAI;IAAQ,CAAC;WACpD,GAAK;AACZ,KAAe,aAAe,QAAQ,EAAI,UAAU,oBAAoB;;;AAI5E,QACE,kBAAC,GAAD;EACE,OACE,kBAAC,QAAD;GAAM,WAAU;aAAhB,CACE,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAW,cAAc;IACxC,WAAU;IACV,cAAW;cAEX,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;IAC1B,CAAA,EACR,EAAW,MACP;;EAET,aAAa,EAAW,WAAW;EACnC,SAAS,kBAAC,GAAD,EAAa,QAAQ,EAAW,QAAU,CAAA;YAfrD,CAiBG,KACC,kBAAC,OAAD;GAAK,WAAU;aACZ;GACG,CAAA,EAGR,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,EAAW,YACV,kBAAC,GAAD;KAAW,WAAU;KAAS,WAAU;eAAxC,CACE,kBAAC,MAAD;MAAI,WAAU;gBAA+C;MAAa,CAAA,EAC1E,kBAAC,KAAD;MAAG,WAAU;gBAA+C,EAAW;MAAa,CAAA,CAC1E;QAId,kBAAC,GAAD;KAAW,WAAU;KAAS,WAAU;eAAxC,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAd;QACE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA;;QACrB,EAAW,UAAU;QAAO;QACrC;UACL,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,EAAW,8BAA8B,EAAW,KAAK;OACxE,WAAU;iBAHZ,CAKE,kBAAC,GAAD,EAAM,WAAU,eAAgB,CAAA,EAAA,YAEzB;SACL;SACL,EAAW,UAAU,WAAW,IAC/B,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAEvC,CAAA,GAEJ,kBAAC,MAAD;MAAI,WAAU;gBACX,EAAW,UAAU,KAAK,MACzB,kBAAC,MAAD,EAAA,UACE,kBAAC,UAAD;OACE,MAAK;OACL,eAAe,EAAW,aAAa,EAAI,KAAK;OAChD,WAAU;iBAHZ,CAKE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,KAAD;SAAG,WAAU;mBAAb,CACG,EAAI,UACJ,EAAI,eACH,kBAAC,QAAD;UAAM,WAAU;oBAAiG;UAE1G,CAAA,CAEP;YACJ,kBAAC,KAAD;SAAG,WAAU;mBAAb,CACG,EAAiB,EAAI,eAAe,EAAI,SAAS,EACjD,EAAI,WAAW,MAAM,EAAI,aAAa,GACrC;WACA;WACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAa,QAAQ,EAAI,QAAU,CAAA,EACnC,kBAAC,GAAD,EAAY,WAAU,+BAAgC,CAAA,CAClD;UACC;UACN,EAzBI,EAAI,GAyBR,CACL;MACC,CAAA,CAEG;OACR;OAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,MAAD;OAAI,WAAU;iBAA+C;OAAsB,CAAA,EACnF,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACG,EAAc,EAAW,QAAQ,KAAK,MACrC,kBAAC,UAAD;QAEE,MAAK;QACL,UAAU,EAAW;QACrB,eAAe,KAAK,EAAiB,EAAO;QAC5C,WAAU;kBAET,EAAgB,EAAO;QACjB,EAPF,EAOE,CACT,EACD,EAAc,EAAW,QAAQ,WAAW,KAC3C,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAqC,CAAA,CAE9E;SACI;;KAEZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC;OACE,kBAAC,MAAD;QAAI,WAAU;kBAA+C;QAAY,CAAA;OACzE,kBAAC,MAAD;QAAI,WAAU;kBAAd;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,MAAD;WAAI,WAAU;qBAAd,CACE,kBAAC,GAAD,EAAO,WAAU,eAAgB,CAAA,EAAA,SAE9B;cACL,kBAAC,MAAD;WAAI,WAAU;qBACX,EAAiB,EAAW,kBAAkB,EAAW,SAAS;WAChE,CAAA,CACD;;SACL,EAAW,aACV,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,MAAD;WAAI,WAAU;qBAAd,CACE,kBAAC,GAAD,EAAU,WAAU,eAAgB,CAAA,EAAA,QAEjC;cACL,kBAAC,MAAD;WAAI,WAAU;qBACX,EAAW,EAAW,WAAW;YAAE,MAAM,KAAA;YAAW,QAAQ,KAAA;YAAW,CAAC;WACtE,CAAA,CACD;;SAEP,EAAW,WACV,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,MAAD;WAAI,WAAU;qBAAd,CACE,kBAAC,GAAD,EAAU,WAAU,eAAgB,CAAA,EAAA,MAEjC;cACL,kBAAC,MAAD;WAAI,WAAU;qBACX,EAAW,EAAW,SAAS;YAAE,MAAM,KAAA;YAAW,QAAQ,KAAA;YAAW,CAAC;WACpE,CAAA,CACD;;SAEL;;OAEJ,EAAW,oBACV,kBAAC,UAAD;QACE,MAAK;QACL,eAAe,EAAW,kBAAkB,EAAW,mBAAmB;QAC1E,WAAU;kBAHZ,CAKE,kBAAC,GAAD,EAAO,WAAU,eAAgB,CAAA,EAAA,uBAE1B;;OAEV,EAAW,0BACV,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAAgD;SACX;SACnC,kBAAC,QAAD;UAAM,WAAU;oBAAa,EAAW;UAA8B,CAAA;SACpE;;OAEI;;KAEX,EAAW,KAAK,SAAS,KACxB,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,MAAD;OAAI,WAAU;iBAAyE;OAElF,CAAA,EACL,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAW,KAAK,KAAK,MACpB,kBAAC,QAAD;QAEE,WAAU;kBAET;QACI,EAJA,EAIA,CACP;OACE,CAAA,CACI;;KAEV;MACF;KACK"}
1
+ {"version":3,"file":"ProductionDetailPage.js","names":[],"sources":["../../../../src/hookmovies/pages/productions/ProductionDetailPage.tsx"],"sourcesContent":["/**\n * Production detail (Production lifecycle)\n * @module hookmovies/pages/productions\n *\n * Reads one production via `hokProduction` (with auditions), advances its\n * lifecycle with `hokTransitionProduction`, and links into the casting auditions\n * the production owns.\n */\n\nimport { type FC, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport {\n ArrowLeft,\n Calendar,\n Coins,\n Megaphone,\n ArrowRight,\n Link2,\n Plus,\n Lightbulb,\n CheckCircle2,\n Clapperboard,\n Scissors,\n Sparkles,\n Archive,\n Wallet,\n MapPin,\n type LucideIcon,\n} from 'lucide-react';\nimport { GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { StatusBadge } from '../../components/StatusBadge';\nimport { EmptyState } from '../../components/EmptyState';\nimport { LoadingState, ErrorState } from '../../components/StateViews';\nimport { useHookMovies } from '../../context/HookMoviesContext';\nimport {\n useProduction,\n useTransitionProduction,\n type HokProductionStatus,\n} from '../../hooks/useHookMoviesApi';\nimport { formatDate, formatEnumLabel, formatMinorUnits } from '../../utils/formatters';\nimport { cn } from '../../utils/cn';\n\nconst NEXT_STATUSES: Record<HokProductionStatus, HokProductionStatus[]> = {\n DEVELOPMENT: ['GREENLIT', 'SHELVED'],\n GREENLIT: ['IN_PRODUCTION', 'SHELVED'],\n IN_PRODUCTION: ['POST_PRODUCTION', 'SHELVED'],\n POST_PRODUCTION: ['RELEASED', 'SHELVED'],\n RELEASED: [],\n SHELVED: ['DEVELOPMENT'],\n};\n\n/** Ordered forward pipeline. `SHELVED` is an off-track state rendered separately. */\nconst LIFECYCLE_ORDER: readonly HokProductionStatus[] = [\n 'DEVELOPMENT',\n 'GREENLIT',\n 'IN_PRODUCTION',\n 'POST_PRODUCTION',\n 'RELEASED',\n];\n\nconst STATUS_ICON: Record<HokProductionStatus, LucideIcon> = {\n DEVELOPMENT: Lightbulb,\n GREENLIT: CheckCircle2,\n IN_PRODUCTION: Clapperboard,\n POST_PRODUCTION: Scissors,\n RELEASED: Sparkles,\n SHELVED: Archive,\n};\n\nexport const ProductionDetailPage: FC = () => {\n const { id } = useParams<{ id: string }>();\n const { navigateTo } = useHookMovies();\n const { data: production, isLoading, isError, refetch } = useProduction(id);\n const transition = useTransitionProduction();\n const [actionError, setActionError] = useState<string | null>(null);\n\n if (isLoading) {\n return (\n <PageLayout title=\"Production\">\n <LoadingState label=\"Loading production…\" />\n </PageLayout>\n );\n }\n\n if (isError || !production) {\n return (\n <PageLayout title=\"Production\">\n <ErrorState title=\"Production not found\" onRetry={() => void refetch()} />\n </PageLayout>\n );\n }\n\n const handleTransition = async (status: HokProductionStatus) => {\n setActionError(null);\n try {\n await transition.mutateAsync({ id: production.id, status });\n } catch (err) {\n setActionError(err instanceof Error ? err.message : 'Transition failed');\n }\n };\n\n const nextStatuses = NEXT_STATUSES[production.status];\n const isShelved = production.status === 'SHELVED';\n const currentIndex = LIFECYCLE_ORDER.indexOf(production.status);\n\n return (\n <PageLayout\n title={\n <span className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => navigateTo('productions')}\n className=\"rounded-md p-1 text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg\"\n aria-label=\"Back to productions\"\n >\n <ArrowLeft className=\"h-5 w-5\" />\n </button>\n {production.title}\n </span>\n }\n description={production.logline ?? 'Production'}\n actions={\n <div className=\"flex flex-wrap items-center gap-2\">\n <StatusBadge status={production.status} />\n <button\n type=\"button\"\n onClick={() => navigateTo(`auditions/new?productionId=${production.id}`)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg focus-visible:ring-offset-2 focus-visible:ring-offset-bg-canvas\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Post Role\n </button>\n </div>\n }\n >\n {actionError && (\n <div\n role=\"alert\"\n className=\"mb-6 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-4 py-2.5 text-sm text-status-error-text\"\n >\n {actionError}\n </div>\n )}\n\n <div className=\"space-y-6\">\n {/* ── Advance Lifecycle ──────────────────────────────────────────── */}\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-5 sm:p-6\">\n <div className=\"mb-5 flex items-center gap-2\">\n <Clapperboard className=\"h-4 w-4 text-text-secondary\" />\n <h2 className=\"text-sm font-semibold text-text-primary\">Advance Lifecycle</h2>\n </div>\n\n {/* Pipeline track */}\n <ol\n className=\"flex items-stretch gap-1.5 overflow-x-auto pb-1 sm:gap-2\"\n aria-label=\"Production lifecycle progress\"\n >\n {LIFECYCLE_ORDER.map((stage, index) => {\n const StageIcon = STATUS_ICON[stage];\n const state =\n currentIndex === -1\n ? 'upcoming'\n : index < currentIndex\n ? 'complete'\n : index === currentIndex\n ? 'current'\n : 'upcoming';\n return (\n <li key={stage} className=\"min-w-[7rem] flex-1\" aria-current={state === 'current'}>\n <div\n className={cn(\n 'flex h-full flex-col gap-2 rounded-lg border px-3 py-2.5 transition-colors',\n state === 'current' &&\n 'border-action-primary-bg bg-action-primary-bg/10 text-text-primary',\n state === 'complete' &&\n 'border-status-success-border bg-status-success-bg-subtle text-status-success-text',\n state === 'upcoming' &&\n 'border-border-seam bg-bg-sunken/40 text-text-secondary'\n )}\n >\n <div className=\"flex items-center justify-between\">\n <StageIcon className=\"h-4 w-4\" />\n <span className=\"text-[10px] font-medium uppercase tracking-wide opacity-70\">\n {String(index + 1).padStart(2, '0')}\n </span>\n </div>\n <span className=\"text-xs font-semibold leading-tight\">\n {formatEnumLabel(stage)}\n </span>\n </div>\n </li>\n );\n })}\n </ol>\n\n {isShelved && (\n <div className=\"mt-4 flex items-center gap-2 rounded-lg border border-status-error-border bg-status-error-bg-subtle px-3 py-2 text-xs text-status-error-text\">\n <Archive className=\"h-3.5 w-3.5\" />\n This production is shelved and off the active pipeline.\n </div>\n )}\n\n {/* Transition actions */}\n <div className=\"mt-5 border-t border-border-seam pt-4\">\n {nextStatuses.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n This production has reached the end of its lifecycle — no further transitions\n available.\n </p>\n ) : (\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center\">\n <span className=\"text-xs font-medium text-text-secondary\">Move to</span>\n <div className=\"flex flex-wrap gap-2\">\n {nextStatuses.map((status) => {\n const ActionIcon = STATUS_ICON[status];\n const isRegressive = status === 'SHELVED';\n return (\n <button\n key={status}\n type=\"button\"\n disabled={transition.isPending}\n onClick={() => void handleTransition(status)}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-lg px-3.5 py-2 text-xs font-semibold transition-all disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-bg-canvas',\n isRegressive\n ? 'border border-status-error-border text-status-error-text hover:bg-status-error-bg-subtle focus-visible:ring-status-error-border'\n : 'bg-action-primary-bg text-action-primary-text hover:opacity-90 focus-visible:ring-action-primary-bg'\n )}\n >\n <ActionIcon className=\"h-3.5 w-3.5\" />\n {formatEnumLabel(status)}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n </GlassCard>\n\n {/* ── Overview + Auditions ───────────────────────────────────────── */}\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n <div className=\"space-y-6 lg:col-span-2\">\n {production.synopsis && (\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-5 sm:p-6\">\n <h2 className=\"mb-2 text-sm font-semibold text-text-primary\">Synopsis</h2>\n <p className=\"whitespace-pre-line text-sm leading-relaxed text-text-secondary\">\n {production.synopsis}\n </p>\n </GlassCard>\n )}\n\n {/* Auditions */}\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-5 sm:p-6\">\n <div className=\"mb-4 flex items-center justify-between gap-3\">\n <h2 className=\"flex items-center gap-2 text-sm font-semibold text-text-primary\">\n <Megaphone className=\"h-4 w-4 text-text-secondary\" />\n Open Auditions / Casting\n <span className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-xs font-medium text-text-secondary\">\n {production.auditions.length}\n </span>\n </h2>\n <button\n type=\"button\"\n onClick={() => navigateTo(`auditions/new?productionId=${production.id}`)}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-lg border border-border-seam px-2.5 py-1 text-xs font-medium text-text-primary transition-colors hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Post Role\n </button>\n </div>\n {production.auditions.length === 0 ? (\n <EmptyState\n title=\"No open roles yet\"\n description=\"Post a casting role to start collecting auditions for this production.\"\n action={\n <button\n type=\"button\"\n onClick={() => navigateTo(`auditions/new?productionId=${production.id}`)}\n className=\"inline-flex items-center gap-1.5 rounded-lg bg-action-primary-bg px-3 py-1.5 text-xs font-semibold text-action-primary-text transition-opacity hover:opacity-90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg\"\n >\n <Plus className=\"h-3.5 w-3.5\" />\n Post Role\n </button>\n }\n />\n ) : (\n <ul className=\"space-y-2\">\n {production.auditions.map((aud) => (\n <li key={aud.id}>\n <button\n type=\"button\"\n onClick={() => navigateTo(`auditions/${aud.id}`)}\n className=\"group flex w-full items-center gap-3 rounded-lg border border-transparent px-3 py-3 text-left transition-colors hover:border-border-seam hover:bg-bg-sunken focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg\"\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <p className=\"truncate text-sm font-medium text-text-primary\">\n {aud.roleName}\n </p>\n {aud.isMinorRole && (\n <span className=\"rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-[10px] font-medium text-status-warning-text\">\n Minor role\n </span>\n )}\n </div>\n <p className=\"mt-1 flex flex-wrap items-center gap-x-3 gap-y-0.5 text-xs text-text-secondary\">\n <span className=\"inline-flex items-center gap-1\">\n <Wallet className=\"h-3 w-3\" />\n {formatMinorUnits(aud.payMinorUnits, aud.currency)}\n </span>\n {aud.location && (\n <span className=\"inline-flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {aud.location}\n </span>\n )}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <StatusBadge status={aud.status} />\n <ArrowRight className=\"h-4 w-4 text-text-secondary transition-transform group-hover:translate-x-0.5\" />\n </div>\n </button>\n </li>\n ))}\n </ul>\n )}\n </GlassCard>\n </div>\n\n {/* ── Facts ────────────────────────────────────────────────────── */}\n <div className=\"space-y-6\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-5 sm:p-6\">\n <h2 className=\"mb-4 text-sm font-semibold text-text-primary\">Facts</h2>\n <dl className=\"grid grid-cols-2 gap-x-4 gap-y-4\">\n <div>\n <dt className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <Coins className=\"h-3.5 w-3.5\" />\n Budget\n </dt>\n <dd className=\"mt-1 text-sm font-semibold text-text-primary\">\n {formatMinorUnits(production.budgetMinorUnits, production.currency)}\n </dd>\n </div>\n <div>\n <dt className=\"text-xs text-text-secondary\">Currency</dt>\n <dd className=\"mt-1 text-sm font-semibold text-text-primary\">\n {production.currency}\n </dd>\n </div>\n {production.startDate && (\n <div>\n <dt className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <Calendar className=\"h-3.5 w-3.5\" />\n Start date\n </dt>\n <dd className=\"mt-1 text-sm font-semibold text-text-primary\">\n {formatDate(production.startDate, { hour: undefined, minute: undefined })}\n </dd>\n </div>\n )}\n {production.endDate && (\n <div>\n <dt className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <Calendar className=\"h-3.5 w-3.5\" />\n End date\n </dt>\n <dd className=\"mt-1 text-sm font-semibold text-text-primary\">\n {formatDate(production.endDate, { hour: undefined, minute: undefined })}\n </dd>\n </div>\n )}\n </dl>\n\n {(production.resultingTitleId || production.artistrybaseProjectRef) && (\n <div className=\"mt-4 space-y-2 border-t border-border-seam pt-4\">\n {production.resultingTitleId && (\n <button\n type=\"button\"\n onClick={() => navigateTo(`catalog/titles/${production.resultingTitleId}`)}\n className=\"inline-flex items-center gap-1.5 text-xs font-semibold text-action-primary-bg transition-opacity hover:opacity-80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-action-primary-bg rounded\"\n >\n <Link2 className=\"h-3.5 w-3.5\" />\n View resulting title\n </button>\n )}\n {production.artistrybaseProjectRef && (\n <p className=\"text-xs text-text-secondary\">\n Promoted from Artistrybase project{' '}\n <span className=\"font-mono text-text-primary\">\n {production.artistrybaseProjectRef}\n </span>\n </p>\n )}\n </div>\n )}\n </GlassCard>\n\n {production.tags.length > 0 && (\n <GlassCard treatment=\"metric\" className=\"border-border-seam p-5 sm:p-6\">\n <h3 className=\"mb-3 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n Tags\n </h3>\n <div className=\"flex flex-wrap gap-1.5\">\n {production.tags.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs text-text-secondary\"\n >\n {tag}\n </span>\n ))}\n </div>\n </GlassCard>\n )}\n </div>\n </div>\n </div>\n </PageLayout>\n );\n};\n"],"mappings":"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"}