@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.
- package/dist/hookmovies/HookMoviesRoutes.js +54 -6
- package/dist/hookmovies/HookMoviesRoutes.js.map +1 -1
- package/dist/hookmovies/components/index.js +1 -1
- package/dist/hookmovies/context/HookMoviesContext.js +64 -40
- package/dist/hookmovies/context/HookMoviesContext.js.map +1 -1
- package/dist/hookmovies/hooks/useHookMoviesApi.js +592 -134
- package/dist/hookmovies/hooks/useHookMoviesApi.js.map +1 -1
- package/dist/hookmovies/pages/HomePage.js +211 -139
- package/dist/hookmovies/pages/HomePage.js.map +1 -1
- package/dist/hookmovies/pages/ai/ConciergePage.js +330 -0
- package/dist/hookmovies/pages/ai/ConciergePage.js.map +1 -0
- package/dist/hookmovies/pages/analytics/AnalyticsPage.js +450 -0
- package/dist/hookmovies/pages/analytics/AnalyticsPage.js.map +1 -0
- package/dist/hookmovies/pages/analytics/PayoutsPage.js +499 -0
- package/dist/hookmovies/pages/analytics/PayoutsPage.js.map +1 -0
- package/dist/hookmovies/pages/auditions/AuditionDetailPage.js +223 -140
- package/dist/hookmovies/pages/auditions/AuditionDetailPage.js.map +1 -1
- package/dist/hookmovies/pages/auditions/AuditionsPage.js +161 -83
- package/dist/hookmovies/pages/auditions/AuditionsPage.js.map +1 -1
- package/dist/hookmovies/pages/catalog/PeoplePage.js +177 -103
- package/dist/hookmovies/pages/catalog/PeoplePage.js.map +1 -1
- package/dist/hookmovies/pages/catalog/StudiosPage.js +191 -108
- package/dist/hookmovies/pages/catalog/StudiosPage.js.map +1 -1
- package/dist/hookmovies/pages/catalog/TitleDetailPage.js +744 -622
- package/dist/hookmovies/pages/catalog/TitleDetailPage.js.map +1 -1
- package/dist/hookmovies/pages/catalog/TitlesPage.js +218 -138
- package/dist/hookmovies/pages/catalog/TitlesPage.js.map +1 -1
- package/dist/hookmovies/pages/commerce/CheckoutPage.js +430 -0
- package/dist/hookmovies/pages/commerce/CheckoutPage.js.map +1 -0
- package/dist/hookmovies/pages/consumer/DiscoveryPage.js +21 -21
- package/dist/hookmovies/pages/consumer/HooksPage.js +5 -5
- package/dist/hookmovies/pages/consumer/TitleViewPage.js +32 -32
- package/dist/hookmovies/pages/consumer/TitleViewPage.js.map +1 -1
- package/dist/hookmovies/pages/developer/DevPortalPage.js +815 -0
- package/dist/hookmovies/pages/developer/DevPortalPage.js.map +1 -0
- package/dist/hookmovies/pages/distribution/RightsWindowsPage.js +235 -162
- package/dist/hookmovies/pages/distribution/RightsWindowsPage.js.map +1 -1
- package/dist/hookmovies/pages/engagement/ReviewsPage.js +201 -143
- package/dist/hookmovies/pages/engagement/ReviewsPage.js.map +1 -1
- package/dist/hookmovies/pages/library/EntitlementsPage.js +447 -221
- package/dist/hookmovies/pages/library/EntitlementsPage.js.map +1 -1
- package/dist/hookmovies/pages/library/ListsPage.js +243 -167
- package/dist/hookmovies/pages/library/ListsPage.js.map +1 -1
- package/dist/hookmovies/pages/live/LivePage.js +608 -0
- package/dist/hookmovies/pages/live/LivePage.js.map +1 -0
- package/dist/hookmovies/pages/localization/LocalizationPage.js +656 -0
- package/dist/hookmovies/pages/localization/LocalizationPage.js.map +1 -0
- package/dist/hookmovies/pages/onboarding/OnboardingPage.js +366 -0
- package/dist/hookmovies/pages/onboarding/OnboardingPage.js.map +1 -0
- package/dist/hookmovies/pages/productions/ProductionDetailPage.js +265 -179
- package/dist/hookmovies/pages/productions/ProductionDetailPage.js.map +1 -1
- package/dist/hookmovies/pages/productions/ProductionsPage.js +264 -71
- package/dist/hookmovies/pages/productions/ProductionsPage.js.map +1 -1
- package/dist/hookmovies/pages/social/ProfilesPage.js +701 -0
- package/dist/hookmovies/pages/social/ProfilesPage.js.map +1 -0
- package/dist/hookmovies/pages/social/WatchPartyListPage.js +281 -0
- package/dist/hookmovies/pages/social/WatchPartyListPage.js.map +1 -0
- package/dist/hookmovies/pages/social/WatchPartyRoomPage.js +567 -0
- package/dist/hookmovies/pages/social/WatchPartyRoomPage.js.map +1 -0
- package/dist/hookmovies/pages/trust/ModerationPage.js +320 -0
- package/dist/hookmovies/pages/trust/ModerationPage.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,234 +1,320 @@
|
|
|
1
1
|
import { useHookMovies as e } from "../../context/HookMoviesContext.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
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
|
|
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
|
-
},
|
|
21
|
-
|
|
22
|
-
|
|
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__ */
|
|
39
|
+
children: /* @__PURE__ */ k(d, { label: "Loading production…" })
|
|
25
40
|
});
|
|
26
|
-
if (
|
|
41
|
+
if (F || !T) return /* @__PURE__ */ k(n, {
|
|
27
42
|
title: "Production",
|
|
28
|
-
children: /* @__PURE__ */
|
|
43
|
+
children: /* @__PURE__ */ k(u, {
|
|
29
44
|
title: "Production not found",
|
|
30
|
-
onRetry: () => void
|
|
45
|
+
onRetry: () => void I()
|
|
31
46
|
})
|
|
32
47
|
});
|
|
33
|
-
let
|
|
34
|
-
|
|
48
|
+
let B = async (e) => {
|
|
49
|
+
z(null);
|
|
35
50
|
try {
|
|
36
|
-
await
|
|
51
|
+
await L.mutateAsync({
|
|
37
52
|
id: T.id,
|
|
38
53
|
status: e
|
|
39
54
|
});
|
|
40
55
|
} catch (e) {
|
|
41
|
-
|
|
56
|
+
z(e instanceof Error ? e.message : "Transition failed");
|
|
42
57
|
}
|
|
43
|
-
};
|
|
44
|
-
return /* @__PURE__ */
|
|
45
|
-
title: /* @__PURE__ */
|
|
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__ */
|
|
62
|
+
children: [/* @__PURE__ */ k("button", {
|
|
48
63
|
type: "button",
|
|
49
|
-
onClick: () =>
|
|
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__ */
|
|
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__ */
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
}),
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
})
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
})
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
}), /* @__PURE__ */
|
|
122
|
-
className: "
|
|
123
|
-
children: [
|
|
124
|
-
|
|
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__ */
|
|
128
|
-
className: "mb-
|
|
129
|
-
children: "
|
|
130
|
-
}), /* @__PURE__ */
|
|
131
|
-
className: "
|
|
132
|
-
children:
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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__ */
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
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: () =>
|
|
196
|
-
className: "
|
|
197
|
-
children: [/* @__PURE__ */
|
|
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
|
-
|
|
200
|
-
className: "
|
|
239
|
+
/* @__PURE__ */ A("dl", {
|
|
240
|
+
className: "grid grid-cols-2 gap-x-4 gap-y-4",
|
|
201
241
|
children: [
|
|
202
|
-
"
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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__ */
|
|
216
|
-
className: "mb-
|
|
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__ */
|
|
304
|
+
}), /* @__PURE__ */ k("div", {
|
|
219
305
|
className: "flex flex-wrap gap-1.5",
|
|
220
|
-
children: T.tags.map((e) => /* @__PURE__ */
|
|
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 {
|
|
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":"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"}
|
|
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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"}
|