@burdenoff/microfe-hookmovies 2026.1024.1 → 2026.1027.2

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 (55) hide show
  1. package/dist/hookmovies/HookMoviesRoutes.d.ts.map +1 -1
  2. package/dist/hookmovies/HookMoviesRoutes.js +38 -30
  3. package/dist/hookmovies/HookMoviesRoutes.js.map +1 -1
  4. package/dist/hookmovies/components/EvidenceFiles.d.ts +6 -0
  5. package/dist/hookmovies/components/EvidenceFiles.d.ts.map +1 -0
  6. package/dist/hookmovies/components/EvidenceFiles.js +42 -0
  7. package/dist/hookmovies/components/EvidenceFiles.js.map +1 -0
  8. package/dist/hookmovies/components/EvidenceUploader.d.ts +16 -0
  9. package/dist/hookmovies/components/EvidenceUploader.d.ts.map +1 -0
  10. package/dist/hookmovies/components/EvidenceUploader.js +90 -0
  11. package/dist/hookmovies/components/EvidenceUploader.js.map +1 -0
  12. package/dist/hookmovies/components/StatusBadge.d.ts.map +1 -1
  13. package/dist/hookmovies/components/StatusBadge.js +1 -0
  14. package/dist/hookmovies/components/StatusBadge.js.map +1 -1
  15. package/dist/hookmovies/hooks/useCastingApi.d.ts +102 -0
  16. package/dist/hookmovies/hooks/useCastingApi.d.ts.map +1 -1
  17. package/dist/hookmovies/hooks/useCastingApi.js +62 -16
  18. package/dist/hookmovies/hooks/useCastingApi.js.map +1 -1
  19. package/dist/hookmovies/hooks/useFiles.d.ts +4 -0
  20. package/dist/hookmovies/hooks/useFiles.d.ts.map +1 -1
  21. package/dist/hookmovies/hooks/useFiles.js +3 -1
  22. package/dist/hookmovies/hooks/useFiles.js.map +1 -1
  23. package/dist/hookmovies/hooks/useHookMoviesApi.d.ts +4 -2
  24. package/dist/hookmovies/hooks/useHookMoviesApi.d.ts.map +1 -1
  25. package/dist/hookmovies/hooks/useHookMoviesApi.js.map +1 -1
  26. package/dist/hookmovies/pages/auditions/AuditionDetailPage.d.ts.map +1 -1
  27. package/dist/hookmovies/pages/auditions/AuditionDetailPage.js +220 -213
  28. package/dist/hookmovies/pages/auditions/AuditionDetailPage.js.map +1 -1
  29. package/dist/hookmovies/pages/casting/GuardianInvitePage.d.ts +6 -0
  30. package/dist/hookmovies/pages/casting/GuardianInvitePage.d.ts.map +1 -0
  31. package/dist/hookmovies/pages/casting/GuardianInvitePage.js +121 -0
  32. package/dist/hookmovies/pages/casting/GuardianInvitePage.js.map +1 -0
  33. package/dist/hookmovies/pages/casting/GuardiansPanel.d.ts +12 -0
  34. package/dist/hookmovies/pages/casting/GuardiansPanel.d.ts.map +1 -0
  35. package/dist/hookmovies/pages/casting/GuardiansPanel.js +234 -0
  36. package/dist/hookmovies/pages/casting/GuardiansPanel.js.map +1 -0
  37. package/dist/hookmovies/pages/casting/IdentityVerificationCard.d.ts +6 -0
  38. package/dist/hookmovies/pages/casting/IdentityVerificationCard.d.ts.map +1 -0
  39. package/dist/hookmovies/pages/casting/IdentityVerificationCard.js +187 -0
  40. package/dist/hookmovies/pages/casting/IdentityVerificationCard.js.map +1 -0
  41. package/dist/hookmovies/pages/casting/MyCastingPage.d.ts.map +1 -1
  42. package/dist/hookmovies/pages/casting/MyCastingPage.js +200 -170
  43. package/dist/hookmovies/pages/casting/MyCastingPage.js.map +1 -1
  44. package/dist/hookmovies/pages/trust/DisputesPage.d.ts.map +1 -1
  45. package/dist/hookmovies/pages/trust/DisputesPage.js +57 -55
  46. package/dist/hookmovies/pages/trust/DisputesPage.js.map +1 -1
  47. package/dist/hookmovies/pages/trust/VerificationsPage.d.ts +4 -0
  48. package/dist/hookmovies/pages/trust/VerificationsPage.d.ts.map +1 -0
  49. package/dist/hookmovies/pages/trust/VerificationsPage.js +163 -0
  50. package/dist/hookmovies/pages/trust/VerificationsPage.js.map +1 -0
  51. package/dist/types/assistant.d.ts.map +1 -1
  52. package/dist/utils/pageContext.d.ts.map +1 -1
  53. package/dist/utils/pageContext.js +8 -0
  54. package/dist/utils/pageContext.js.map +1 -1
  55. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"HookMoviesRoutes.d.ts","sourceRoot":"","sources":["../../src/hookmovies/HookMoviesRoutes.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,EAAqD,MAAM,OAAO,CAAC;AA8KnF,eAAO,MAAM,gBAAgB,EAAE,EAgG9B,CAAC"}
1
+ {"version":3,"file":"HookMoviesRoutes.d.ts","sourceRoot":"","sources":["../../src/hookmovies/HookMoviesRoutes.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,EAAqD,MAAM,OAAO,CAAC;AAoLnF,eAAO,MAAM,gBAAgB,EAAE,EAkG9B,CAAC"}
@@ -5,10 +5,10 @@ import { Navigate as i, Route as a, Routes as o, useLocation as s } from "react-
5
5
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
6
6
  import { FeatureGate as u } from "@burdenoff/fe-libs/shared/feature-flags";
7
7
  //#region src/hookmovies/HookMoviesRoutes.tsx
8
- var d = r(() => import("./pages/catalog/TitlesPage.js").then((e) => ({ default: e.TitlesPage }))), f = r(() => import("./pages/catalog/TitleCreatePage.js").then((e) => ({ default: e.TitleCreatePage }))), p = r(() => import("./pages/catalog/TitleDetailPage.js").then((e) => ({ default: e.TitleDetailPage }))), m = r(() => import("./pages/catalog/StudiosPage.js").then((e) => ({ default: e.StudiosPage }))), h = r(() => import("./pages/catalog/PeoplePage.js").then((e) => ({ default: e.PeoplePage }))), g = r(() => import("./pages/productions/ProductionsPage.js").then((e) => ({ default: e.ProductionsPage }))), _ = r(() => import("./pages/productions/ProductionCreatePage.js").then((e) => ({ default: e.ProductionCreatePage }))), v = r(() => import("./pages/productions/ProductionDetailPage.js").then((e) => ({ default: e.ProductionDetailPage }))), y = r(() => import("./pages/auditions/AuditionsPage.js").then((e) => ({ default: e.AuditionsPage }))), b = r(() => import("./pages/auditions/AuditionCreatePage.js").then((e) => ({ default: e.AuditionCreatePage }))), x = r(() => import("./pages/auditions/AuditionDetailPage.js").then((e) => ({ default: e.AuditionDetailPage }))), S = r(() => import("./pages/casting/MyCastingPage.js").then((e) => ({ default: e.MyCastingPage }))), C = r(() => import("./pages/casting/SavedSearchesPage.js").then((e) => ({ default: e.SavedSearchesPage }))), w = r(() => import("./pages/trust/DisputesPage.js").then((e) => ({ default: e.DisputesPage }))), T = r(() => import("./pages/engagement/ReviewsPage.js").then((e) => ({ default: e.ReviewsPage }))), E = r(() => import("./pages/distribution/RightsWindowsPage.js").then((e) => ({ default: e.RightsWindowsPage }))), D = r(() => import("./pages/library/ListsPage.js").then((e) => ({ default: e.ListsPage }))), O = r(() => import("./pages/library/EntitlementsPage.js").then((e) => ({ default: e.EntitlementsPage }))), k = r(() => import("./pages/consumer/DiscoveryPage.js").then((e) => ({ default: e.DiscoveryPage }))), A = r(() => import("./pages/consumer/TitleViewPage.js").then((e) => ({ default: e.TitleViewPage }))), j = r(() => import("./pages/consumer/PlayerPage.js").then((e) => ({ default: e.PlayerPage }))), M = r(() => import("./pages/consumer/HooksPage.js").then((e) => ({ default: e.HooksPage }))), N = r(() => import("./pages/social/ProfilesPage.js").then((e) => ({ default: e.ProfilesPage }))), P = r(() => import("./pages/social/WatchPartyListPage.js").then((e) => ({ default: e.WatchPartyListPage }))), F = r(() => import("./pages/social/WatchPartyRoomPage.js").then((e) => ({ default: e.WatchPartyRoomPage }))), I = r(() => import("./pages/commerce/CheckoutPage.js").then((e) => ({ default: e.CheckoutPage }))), L = r(() => import("./pages/analytics/PayoutsPage.js").then((e) => ({ default: e.PayoutsPage }))), R = r(() => import("./pages/analytics/AnalyticsPage.js").then((e) => ({ default: e.AnalyticsPage }))), z = r(() => import("./pages/trust/ModerationPage.js").then((e) => ({ default: e.ModerationPage }))), B = r(() => import("./pages/onboarding/OnboardingPage.js").then((e) => ({ default: e.OnboardingPage }))), V = r(() => import("./pages/developer/DevPortalPage.js").then((e) => ({ default: e.DevPortalPage }))), H = r(() => import("./pages/live/LivePage.js").then((e) => ({ default: e.LivePage }))), U = r(() => import("./pages/localization/LocalizationPage.js").then((e) => ({ default: e.LocalizationPage }))), W = r(() => import("./pages/ai/ConciergePage.js").then((e) => ({ default: e.ConciergePage }))), G = () => /* @__PURE__ */ c("div", {
8
+ var d = r(() => import("./pages/catalog/TitlesPage.js").then((e) => ({ default: e.TitlesPage }))), f = r(() => import("./pages/catalog/TitleCreatePage.js").then((e) => ({ default: e.TitleCreatePage }))), p = r(() => import("./pages/catalog/TitleDetailPage.js").then((e) => ({ default: e.TitleDetailPage }))), m = r(() => import("./pages/catalog/StudiosPage.js").then((e) => ({ default: e.StudiosPage }))), h = r(() => import("./pages/catalog/PeoplePage.js").then((e) => ({ default: e.PeoplePage }))), g = r(() => import("./pages/productions/ProductionsPage.js").then((e) => ({ default: e.ProductionsPage }))), _ = r(() => import("./pages/productions/ProductionCreatePage.js").then((e) => ({ default: e.ProductionCreatePage }))), v = r(() => import("./pages/productions/ProductionDetailPage.js").then((e) => ({ default: e.ProductionDetailPage }))), y = r(() => import("./pages/auditions/AuditionsPage.js").then((e) => ({ default: e.AuditionsPage }))), b = r(() => import("./pages/auditions/AuditionCreatePage.js").then((e) => ({ default: e.AuditionCreatePage }))), x = r(() => import("./pages/auditions/AuditionDetailPage.js").then((e) => ({ default: e.AuditionDetailPage }))), S = r(() => import("./pages/casting/MyCastingPage.js").then((e) => ({ default: e.MyCastingPage }))), C = r(() => import("./pages/casting/SavedSearchesPage.js").then((e) => ({ default: e.SavedSearchesPage }))), w = r(() => import("./pages/trust/DisputesPage.js").then((e) => ({ default: e.DisputesPage }))), T = r(() => import("./pages/trust/VerificationsPage.js").then((e) => ({ default: e.VerificationsPage }))), E = r(() => import("./pages/casting/GuardianInvitePage.js").then((e) => ({ default: e.GuardianInvitePage }))), D = r(() => import("./pages/engagement/ReviewsPage.js").then((e) => ({ default: e.ReviewsPage }))), O = r(() => import("./pages/distribution/RightsWindowsPage.js").then((e) => ({ default: e.RightsWindowsPage }))), k = r(() => import("./pages/library/ListsPage.js").then((e) => ({ default: e.ListsPage }))), A = r(() => import("./pages/library/EntitlementsPage.js").then((e) => ({ default: e.EntitlementsPage }))), j = r(() => import("./pages/consumer/DiscoveryPage.js").then((e) => ({ default: e.DiscoveryPage }))), M = r(() => import("./pages/consumer/TitleViewPage.js").then((e) => ({ default: e.TitleViewPage }))), N = r(() => import("./pages/consumer/PlayerPage.js").then((e) => ({ default: e.PlayerPage }))), P = r(() => import("./pages/consumer/HooksPage.js").then((e) => ({ default: e.HooksPage }))), F = r(() => import("./pages/social/ProfilesPage.js").then((e) => ({ default: e.ProfilesPage }))), I = r(() => import("./pages/social/WatchPartyListPage.js").then((e) => ({ default: e.WatchPartyListPage }))), L = r(() => import("./pages/social/WatchPartyRoomPage.js").then((e) => ({ default: e.WatchPartyRoomPage }))), R = r(() => import("./pages/commerce/CheckoutPage.js").then((e) => ({ default: e.CheckoutPage }))), z = r(() => import("./pages/analytics/PayoutsPage.js").then((e) => ({ default: e.PayoutsPage }))), B = r(() => import("./pages/analytics/AnalyticsPage.js").then((e) => ({ default: e.AnalyticsPage }))), V = r(() => import("./pages/trust/ModerationPage.js").then((e) => ({ default: e.ModerationPage }))), H = r(() => import("./pages/onboarding/OnboardingPage.js").then((e) => ({ default: e.OnboardingPage }))), U = r(() => import("./pages/developer/DevPortalPage.js").then((e) => ({ default: e.DevPortalPage }))), W = r(() => import("./pages/live/LivePage.js").then((e) => ({ default: e.LivePage }))), G = r(() => import("./pages/localization/LocalizationPage.js").then((e) => ({ default: e.LocalizationPage }))), K = r(() => import("./pages/ai/ConciergePage.js").then((e) => ({ default: e.ConciergePage }))), q = () => /* @__PURE__ */ c("div", {
9
9
  className: "flex min-h-[400px] items-center justify-center",
10
10
  children: /* @__PURE__ */ c("div", { className: "h-8 w-8 animate-spin rounded-full border-b-2 border-action-primary-bg" })
11
- }), K = () => /* @__PURE__ */ l("div", {
11
+ }), J = () => /* @__PURE__ */ l("div", {
12
12
  className: "flex min-h-[400px] flex-col items-center justify-center gap-2 px-6 text-center",
13
13
  children: [/* @__PURE__ */ c("h2", {
14
14
  className: "text-lg font-semibold text-text-primary",
@@ -18,20 +18,20 @@ var d = r(() => import("./pages/catalog/TitlesPage.js").then((e) => ({ default:
18
18
  children: "This feature is currently disabled for this workspace."
19
19
  })]
20
20
  });
21
- function q(e, t) {
21
+ function Y(e, t) {
22
22
  return /* @__PURE__ */ c(u, {
23
23
  flag: e,
24
24
  defaultValue: !0,
25
- fallback: /* @__PURE__ */ c(K, {}),
25
+ fallback: /* @__PURE__ */ c(J, {}),
26
26
  children: t
27
27
  });
28
28
  }
29
- var J = () => {
30
- let { basePath: r, isStandalone: u } = e(), K = s(), J = r === "/" ? "" : (r ?? "").replace(/\/$/, "");
31
- return J && !u && !(K.pathname === J || K.pathname.startsWith(J + "/")) ? null : /* @__PURE__ */ c("div", {
29
+ var X = () => {
30
+ let { basePath: r, isStandalone: u } = e(), J = s(), X = r === "/" ? "" : (r ?? "").replace(/\/$/, "");
31
+ return X && !u && !(J.pathname === X || J.pathname.startsWith(X + "/")) ? null : /* @__PURE__ */ c("div", {
32
32
  className: "flex min-h-full flex-col",
33
33
  children: /* @__PURE__ */ c(n, {
34
- fallback: /* @__PURE__ */ c(G, {}),
34
+ fallback: /* @__PURE__ */ c(q, {}),
35
35
  children: /* @__PURE__ */ l(o, { children: [
36
36
  /* @__PURE__ */ c(a, {
37
37
  index: !0,
@@ -89,93 +89,101 @@ var J = () => {
89
89
  path: "casting/saved-searches",
90
90
  element: /* @__PURE__ */ c(C, {})
91
91
  }),
92
+ /* @__PURE__ */ c(a, {
93
+ path: "casting/guardian-invite",
94
+ element: /* @__PURE__ */ c(E, {})
95
+ }),
92
96
  /* @__PURE__ */ c(a, {
93
97
  path: "engagement/reviews",
94
- element: /* @__PURE__ */ c(T, {})
98
+ element: /* @__PURE__ */ c(D, {})
95
99
  }),
96
100
  /* @__PURE__ */ c(a, {
97
101
  path: "distribution/rights",
98
- element: /* @__PURE__ */ c(E, {})
102
+ element: /* @__PURE__ */ c(O, {})
99
103
  }),
100
104
  /* @__PURE__ */ c(a, {
101
105
  path: "library/lists",
102
- element: /* @__PURE__ */ c(D, {})
106
+ element: /* @__PURE__ */ c(k, {})
103
107
  }),
104
108
  /* @__PURE__ */ c(a, {
105
109
  path: "library/entitlements",
106
- element: /* @__PURE__ */ c(O, {})
110
+ element: /* @__PURE__ */ c(A, {})
107
111
  }),
108
112
  /* @__PURE__ */ c(a, {
109
113
  path: "browse",
110
- element: /* @__PURE__ */ c(k, {})
114
+ element: /* @__PURE__ */ c(j, {})
111
115
  }),
112
116
  /* @__PURE__ */ c(a, {
113
117
  path: "title/:id",
114
- element: /* @__PURE__ */ c(A, {})
118
+ element: /* @__PURE__ */ c(M, {})
115
119
  }),
116
120
  /* @__PURE__ */ c(a, {
117
121
  path: "watch/:titleId",
118
- element: /* @__PURE__ */ c(j, {})
122
+ element: /* @__PURE__ */ c(N, {})
119
123
  }),
120
124
  /* @__PURE__ */ c(a, {
121
125
  path: "watch/:titleId/episode/:episodeId",
122
- element: /* @__PURE__ */ c(j, {})
126
+ element: /* @__PURE__ */ c(N, {})
123
127
  }),
124
128
  /* @__PURE__ */ c(a, {
125
129
  path: "hooks",
126
- element: q("hookmovies.hooks.enabled", /* @__PURE__ */ c(M, {}))
130
+ element: Y("hookmovies.hooks.enabled", /* @__PURE__ */ c(P, {}))
127
131
  }),
128
132
  /* @__PURE__ */ c(a, {
129
133
  path: "profiles",
130
- element: /* @__PURE__ */ c(N, {})
134
+ element: /* @__PURE__ */ c(F, {})
131
135
  }),
132
136
  /* @__PURE__ */ c(a, {
133
137
  path: "watch-party",
134
- element: /* @__PURE__ */ c(P, {})
138
+ element: /* @__PURE__ */ c(I, {})
135
139
  }),
136
140
  /* @__PURE__ */ c(a, {
137
141
  path: "watch-party/:id",
138
- element: /* @__PURE__ */ c(F, {})
142
+ element: /* @__PURE__ */ c(L, {})
139
143
  }),
140
144
  /* @__PURE__ */ c(a, {
141
145
  path: "checkout/:titleId",
142
- element: /* @__PURE__ */ c(I, {})
146
+ element: /* @__PURE__ */ c(R, {})
143
147
  }),
144
148
  /* @__PURE__ */ c(a, {
145
149
  path: "payouts",
146
- element: /* @__PURE__ */ c(L, {})
150
+ element: /* @__PURE__ */ c(z, {})
147
151
  }),
148
152
  /* @__PURE__ */ c(a, {
149
153
  path: "analytics",
150
- element: /* @__PURE__ */ c(R, {})
154
+ element: /* @__PURE__ */ c(B, {})
151
155
  }),
152
156
  /* @__PURE__ */ c(a, {
153
157
  path: "trust/moderation",
154
- element: /* @__PURE__ */ c(z, {})
158
+ element: /* @__PURE__ */ c(V, {})
155
159
  }),
156
160
  /* @__PURE__ */ c(a, {
157
161
  path: "trust/disputes",
158
162
  element: /* @__PURE__ */ c(w, {})
159
163
  }),
164
+ /* @__PURE__ */ c(a, {
165
+ path: "trust/verifications",
166
+ element: /* @__PURE__ */ c(T, {})
167
+ }),
160
168
  /* @__PURE__ */ c(a, {
161
169
  path: "onboarding/languages",
162
- element: /* @__PURE__ */ c(B, {})
170
+ element: /* @__PURE__ */ c(H, {})
163
171
  }),
164
172
  /* @__PURE__ */ c(a, {
165
173
  path: "developer",
166
- element: /* @__PURE__ */ c(V, {})
174
+ element: /* @__PURE__ */ c(U, {})
167
175
  }),
168
176
  /* @__PURE__ */ c(a, {
169
177
  path: "live",
170
- element: q("hookmovies.fast.enabled", /* @__PURE__ */ c(H, {}))
178
+ element: Y("hookmovies.fast.enabled", /* @__PURE__ */ c(W, {}))
171
179
  }),
172
180
  /* @__PURE__ */ c(a, {
173
181
  path: "title/:id/localization",
174
- element: /* @__PURE__ */ c(U, {})
182
+ element: /* @__PURE__ */ c(G, {})
175
183
  }),
176
184
  /* @__PURE__ */ c(a, {
177
185
  path: "concierge",
178
- element: q("hookmovies.ai.concierge", /* @__PURE__ */ c(W, {}))
186
+ element: Y("hookmovies.ai.concierge", /* @__PURE__ */ c(K, {}))
179
187
  }),
180
188
  /* @__PURE__ */ c(a, {
181
189
  path: "*",
@@ -189,6 +197,6 @@ var J = () => {
189
197
  });
190
198
  };
191
199
  //#endregion
192
- export { J as HookMoviesRoutes };
200
+ export { X as HookMoviesRoutes };
193
201
 
194
202
  //# sourceMappingURL=HookMoviesRoutes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HookMoviesRoutes.js","names":[],"sources":["../../src/hookmovies/HookMoviesRoutes.tsx"],"sourcesContent":["/**\n * HookMovies Routes\n * @module hookmovies\n *\n * Real domain routes for the HookMovies workspace product: catalog (titles,\n * studios, people), production lifecycle, casting auditions, audience\n * engagement (reviews), rights & distribution, and the user library (lists +\n * entitlements). All data comes from the live `hookmovies` subgraph.\n */\n\nimport { type FC, lazy, Suspense, type ReactNode, type ReactElement } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useHookMovies } from './context/HookMoviesContext';\n\n// Eager — primary landing\nimport { HomePage } from './pages/HomePage';\n\n// Catalog\nconst TitlesPage = lazy(() =>\n import('./pages/catalog/TitlesPage').then((m) => ({ default: m.TitlesPage }))\n);\nconst TitleCreatePage = lazy(() =>\n import('./pages/catalog/TitleCreatePage').then((m) => ({ default: m.TitleCreatePage }))\n);\nconst TitleDetailPage = lazy(() =>\n import('./pages/catalog/TitleDetailPage').then((m) => ({ default: m.TitleDetailPage }))\n);\nconst StudiosPage = lazy(() =>\n import('./pages/catalog/StudiosPage').then((m) => ({ default: m.StudiosPage }))\n);\nconst PeoplePage = lazy(() =>\n import('./pages/catalog/PeoplePage').then((m) => ({ default: m.PeoplePage }))\n);\n\n// Productions\nconst ProductionsPage = lazy(() =>\n import('./pages/productions/ProductionsPage').then((m) => ({ default: m.ProductionsPage }))\n);\nconst ProductionCreatePage = lazy(() =>\n import('./pages/productions/ProductionCreatePage').then((m) => ({\n default: m.ProductionCreatePage,\n }))\n);\nconst ProductionDetailPage = lazy(() =>\n import('./pages/productions/ProductionDetailPage').then((m) => ({\n default: m.ProductionDetailPage,\n }))\n);\n\n// Auditions\nconst AuditionsPage = lazy(() =>\n import('./pages/auditions/AuditionsPage').then((m) => ({ default: m.AuditionsPage }))\n);\nconst AuditionCreatePage = lazy(() =>\n import('./pages/auditions/AuditionCreatePage').then((m) => ({ default: m.AuditionCreatePage }))\n);\nconst AuditionDetailPage = lazy(() =>\n import('./pages/auditions/AuditionDetailPage').then((m) => ({ default: m.AuditionDetailPage }))\n);\n\n// Casting trust layer (BOFF-4245)\nconst MyCastingPage = lazy(() =>\n import('./pages/casting/MyCastingPage').then((m) => ({ default: m.MyCastingPage }))\n);\nconst SavedSearchesPage = lazy(() =>\n import('./pages/casting/SavedSearchesPage').then((m) => ({ default: m.SavedSearchesPage }))\n);\nconst DisputesPage = lazy(() =>\n import('./pages/trust/DisputesPage').then((m) => ({ default: m.DisputesPage }))\n);\n\n// Engagement\nconst ReviewsPage = lazy(() =>\n import('./pages/engagement/ReviewsPage').then((m) => ({ default: m.ReviewsPage }))\n);\n\n// Distribution\nconst RightsWindowsPage = lazy(() =>\n import('./pages/distribution/RightsWindowsPage').then((m) => ({ default: m.RightsWindowsPage }))\n);\n\n// Library\nconst ListsPage = lazy(() =>\n import('./pages/library/ListsPage').then((m) => ({ default: m.ListsPage }))\n);\nconst EntitlementsPage = lazy(() =>\n import('./pages/library/EntitlementsPage').then((m) => ({ default: m.EntitlementsPage }))\n);\n\n// Consumer (audience-facing) — discovery, title view, playback, hooks feed\nconst DiscoveryPage = lazy(() =>\n import('./pages/consumer/DiscoveryPage').then((m) => ({ default: m.DiscoveryPage }))\n);\nconst TitleViewPage = lazy(() =>\n import('./pages/consumer/TitleViewPage').then((m) => ({ default: m.TitleViewPage }))\n);\nconst PlayerPage = lazy(() =>\n import('./pages/consumer/PlayerPage').then((m) => ({ default: m.PlayerPage }))\n);\nconst HooksPage = lazy(() =>\n import('./pages/consumer/HooksPage').then((m) => ({ default: m.HooksPage }))\n);\n\n// Social — viewing profiles & synchronized watch parties\nconst ProfilesPage = lazy(() =>\n import('./pages/social/ProfilesPage').then((m) => ({ default: m.ProfilesPage }))\n);\nconst WatchPartyListPage = lazy(() =>\n import('./pages/social/WatchPartyListPage').then((m) => ({ default: m.WatchPartyListPage }))\n);\nconst WatchPartyRoomPage = lazy(() =>\n import('./pages/social/WatchPartyRoomPage').then((m) => ({ default: m.WatchPartyRoomPage }))\n);\n\n// Commerce — checkout (TVOD purchase / rental) & creator payouts\nconst CheckoutPage = lazy(() =>\n import('./pages/commerce/CheckoutPage').then((m) => ({ default: m.CheckoutPage }))\n);\nconst PayoutsPage = lazy(() =>\n import('./pages/analytics/PayoutsPage').then((m) => ({ default: m.PayoutsPage }))\n);\n\n// Analytics — creator / operator performance dashboards\nconst AnalyticsPage = lazy(() =>\n import('./pages/analytics/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\n\n// Trust & safety — moderation queue\nconst ModerationPage = lazy(() =>\n import('./pages/trust/ModerationPage').then((m) => ({ default: m.ModerationPage }))\n);\n\n// Onboarding — language / content preferences\nconst OnboardingPage = lazy(() =>\n import('./pages/onboarding/OnboardingPage').then((m) => ({ default: m.OnboardingPage }))\n);\n\n// Developer portal — API keys\nconst DevPortalPage = lazy(() =>\n import('./pages/developer/DevPortalPage').then((m) => ({ default: m.DevPortalPage }))\n);\n\n// Live — FAST linear channels & schedules\nconst LivePage = lazy(() => import('./pages/live/LivePage').then((m) => ({ default: m.LivePage })));\n\n// Localization — per-title subtitle / caption / dub track management\nconst LocalizationPage = lazy(() =>\n import('./pages/localization/LocalizationPage').then((m) => ({ default: m.LocalizationPage }))\n);\n\n// AI — concierge / recommendations assistant\nconst ConciergePage = lazy(() =>\n import('./pages/ai/ConciergePage').then((m) => ({ default: m.ConciergePage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-b-2 border-action-primary-bg\" />\n </div>\n);\n\nconst FeatureDisabledFallback: FC = () => (\n <div className=\"flex min-h-[400px] flex-col items-center justify-center gap-2 px-6 text-center\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Coming soon</h2>\n <p className=\"max-w-sm text-sm text-text-secondary\">\n This feature is currently disabled for this workspace.\n </p>\n </div>\n);\n\n/**\n * Wrap a route element in a `FeatureGate` with the shared \"coming soon\"\n * fallback. `defaultValue={true}` keeps already-shipped screens visible\n * before their flag is seeded — seeding must never hide a working feature.\n */\nfunction gated(flag: string, element: ReactNode): ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={true} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nexport const HookMoviesRoutes: FC = () => {\n const { basePath, isStandalone } = useHookMovies();\n const location = useLocation();\n\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Overview / dashboard */}\n <Route index element={<HomePage />} />\n\n {/* Catalog */}\n <Route path=\"catalog/titles\" element={<TitlesPage />} />\n <Route path=\"catalog/titles/new\" element={<TitleCreatePage />} />\n <Route path=\"catalog/titles/:id\" element={<TitleDetailPage />} />\n <Route path=\"catalog/studios\" element={<StudiosPage />} />\n <Route path=\"catalog/people\" element={<PeoplePage />} />\n\n {/* Productions */}\n <Route path=\"productions\" element={<ProductionsPage />} />\n <Route path=\"productions/new\" element={<ProductionCreatePage />} />\n <Route path=\"productions/:id\" element={<ProductionDetailPage />} />\n\n {/* Auditions */}\n <Route path=\"auditions\" element={<AuditionsPage />} />\n <Route path=\"auditions/new\" element={<AuditionCreatePage />} />\n <Route path=\"auditions/:id\" element={<AuditionDetailPage />} />\n <Route path=\"casting/mine\" element={<MyCastingPage />} />\n <Route path=\"casting/saved-searches\" element={<SavedSearchesPage />} />\n\n {/* Engagement */}\n <Route path=\"engagement/reviews\" element={<ReviewsPage />} />\n\n {/* Distribution */}\n <Route path=\"distribution/rights\" element={<RightsWindowsPage />} />\n\n {/* Library */}\n <Route path=\"library/lists\" element={<ListsPage />} />\n <Route path=\"library/entitlements\" element={<EntitlementsPage />} />\n\n {/* Consumer (audience-facing) */}\n <Route path=\"browse\" element={<DiscoveryPage />} />\n <Route path=\"title/:id\" element={<TitleViewPage />} />\n <Route path=\"watch/:titleId\" element={<PlayerPage />} />\n <Route path=\"watch/:titleId/episode/:episodeId\" element={<PlayerPage />} />\n <Route path=\"hooks\" element={gated('hookmovies.hooks.enabled', <HooksPage />)} />\n\n {/* Social — profiles & watch parties */}\n <Route path=\"profiles\" element={<ProfilesPage />} />\n <Route path=\"watch-party\" element={<WatchPartyListPage />} />\n <Route path=\"watch-party/:id\" element={<WatchPartyRoomPage />} />\n\n {/* Commerce — checkout & payouts */}\n <Route path=\"checkout/:titleId\" element={<CheckoutPage />} />\n <Route path=\"payouts\" element={<PayoutsPage />} />\n\n {/* Analytics */}\n <Route path=\"analytics\" element={<AnalyticsPage />} />\n\n {/* Trust & safety */}\n <Route path=\"trust/moderation\" element={<ModerationPage />} />\n <Route path=\"trust/disputes\" element={<DisputesPage />} />\n\n {/* Onboarding */}\n <Route path=\"onboarding/languages\" element={<OnboardingPage />} />\n\n {/* Developer portal */}\n <Route path=\"developer\" element={<DevPortalPage />} />\n\n {/* Live — FAST channels */}\n <Route path=\"live\" element={gated('hookmovies.fast.enabled', <LivePage />)} />\n\n {/* Localization */}\n <Route path=\"title/:id/localization\" element={<LocalizationPage />} />\n\n {/* AI concierge */}\n <Route path=\"concierge\" element={gated('hookmovies.ai.concierge', <ConciergePage />)} />\n\n {/* Fallback */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"HookMoviesRoutes.js","names":[],"sources":["../../src/hookmovies/HookMoviesRoutes.tsx"],"sourcesContent":["/**\n * HookMovies Routes\n * @module hookmovies\n *\n * Real domain routes for the HookMovies workspace product: catalog (titles,\n * studios, people), production lifecycle, casting auditions, audience\n * engagement (reviews), rights & distribution, and the user library (lists +\n * entitlements). All data comes from the live `hookmovies` subgraph.\n */\n\nimport { type FC, lazy, Suspense, type ReactNode, type ReactElement } from 'react';\nimport { Routes, Route, Navigate, useLocation } from 'react-router';\nimport { FeatureGate } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { useHookMovies } from './context/HookMoviesContext';\n\n// Eager — primary landing\nimport { HomePage } from './pages/HomePage';\n\n// Catalog\nconst TitlesPage = lazy(() =>\n import('./pages/catalog/TitlesPage').then((m) => ({ default: m.TitlesPage }))\n);\nconst TitleCreatePage = lazy(() =>\n import('./pages/catalog/TitleCreatePage').then((m) => ({ default: m.TitleCreatePage }))\n);\nconst TitleDetailPage = lazy(() =>\n import('./pages/catalog/TitleDetailPage').then((m) => ({ default: m.TitleDetailPage }))\n);\nconst StudiosPage = lazy(() =>\n import('./pages/catalog/StudiosPage').then((m) => ({ default: m.StudiosPage }))\n);\nconst PeoplePage = lazy(() =>\n import('./pages/catalog/PeoplePage').then((m) => ({ default: m.PeoplePage }))\n);\n\n// Productions\nconst ProductionsPage = lazy(() =>\n import('./pages/productions/ProductionsPage').then((m) => ({ default: m.ProductionsPage }))\n);\nconst ProductionCreatePage = lazy(() =>\n import('./pages/productions/ProductionCreatePage').then((m) => ({\n default: m.ProductionCreatePage,\n }))\n);\nconst ProductionDetailPage = lazy(() =>\n import('./pages/productions/ProductionDetailPage').then((m) => ({\n default: m.ProductionDetailPage,\n }))\n);\n\n// Auditions\nconst AuditionsPage = lazy(() =>\n import('./pages/auditions/AuditionsPage').then((m) => ({ default: m.AuditionsPage }))\n);\nconst AuditionCreatePage = lazy(() =>\n import('./pages/auditions/AuditionCreatePage').then((m) => ({ default: m.AuditionCreatePage }))\n);\nconst AuditionDetailPage = lazy(() =>\n import('./pages/auditions/AuditionDetailPage').then((m) => ({ default: m.AuditionDetailPage }))\n);\n\n// Casting trust layer (BOFF-4245)\nconst MyCastingPage = lazy(() =>\n import('./pages/casting/MyCastingPage').then((m) => ({ default: m.MyCastingPage }))\n);\nconst SavedSearchesPage = lazy(() =>\n import('./pages/casting/SavedSearchesPage').then((m) => ({ default: m.SavedSearchesPage }))\n);\nconst DisputesPage = lazy(() =>\n import('./pages/trust/DisputesPage').then((m) => ({ default: m.DisputesPage }))\n);\nconst VerificationsPage = lazy(() =>\n import('./pages/trust/VerificationsPage').then((m) => ({ default: m.VerificationsPage }))\n);\nconst GuardianInvitePage = lazy(() =>\n import('./pages/casting/GuardianInvitePage').then((m) => ({ default: m.GuardianInvitePage }))\n);\n\n// Engagement\nconst ReviewsPage = lazy(() =>\n import('./pages/engagement/ReviewsPage').then((m) => ({ default: m.ReviewsPage }))\n);\n\n// Distribution\nconst RightsWindowsPage = lazy(() =>\n import('./pages/distribution/RightsWindowsPage').then((m) => ({ default: m.RightsWindowsPage }))\n);\n\n// Library\nconst ListsPage = lazy(() =>\n import('./pages/library/ListsPage').then((m) => ({ default: m.ListsPage }))\n);\nconst EntitlementsPage = lazy(() =>\n import('./pages/library/EntitlementsPage').then((m) => ({ default: m.EntitlementsPage }))\n);\n\n// Consumer (audience-facing) — discovery, title view, playback, hooks feed\nconst DiscoveryPage = lazy(() =>\n import('./pages/consumer/DiscoveryPage').then((m) => ({ default: m.DiscoveryPage }))\n);\nconst TitleViewPage = lazy(() =>\n import('./pages/consumer/TitleViewPage').then((m) => ({ default: m.TitleViewPage }))\n);\nconst PlayerPage = lazy(() =>\n import('./pages/consumer/PlayerPage').then((m) => ({ default: m.PlayerPage }))\n);\nconst HooksPage = lazy(() =>\n import('./pages/consumer/HooksPage').then((m) => ({ default: m.HooksPage }))\n);\n\n// Social — viewing profiles & synchronized watch parties\nconst ProfilesPage = lazy(() =>\n import('./pages/social/ProfilesPage').then((m) => ({ default: m.ProfilesPage }))\n);\nconst WatchPartyListPage = lazy(() =>\n import('./pages/social/WatchPartyListPage').then((m) => ({ default: m.WatchPartyListPage }))\n);\nconst WatchPartyRoomPage = lazy(() =>\n import('./pages/social/WatchPartyRoomPage').then((m) => ({ default: m.WatchPartyRoomPage }))\n);\n\n// Commerce — checkout (TVOD purchase / rental) & creator payouts\nconst CheckoutPage = lazy(() =>\n import('./pages/commerce/CheckoutPage').then((m) => ({ default: m.CheckoutPage }))\n);\nconst PayoutsPage = lazy(() =>\n import('./pages/analytics/PayoutsPage').then((m) => ({ default: m.PayoutsPage }))\n);\n\n// Analytics — creator / operator performance dashboards\nconst AnalyticsPage = lazy(() =>\n import('./pages/analytics/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\n\n// Trust & safety — moderation queue\nconst ModerationPage = lazy(() =>\n import('./pages/trust/ModerationPage').then((m) => ({ default: m.ModerationPage }))\n);\n\n// Onboarding — language / content preferences\nconst OnboardingPage = lazy(() =>\n import('./pages/onboarding/OnboardingPage').then((m) => ({ default: m.OnboardingPage }))\n);\n\n// Developer portal — API keys\nconst DevPortalPage = lazy(() =>\n import('./pages/developer/DevPortalPage').then((m) => ({ default: m.DevPortalPage }))\n);\n\n// Live — FAST linear channels & schedules\nconst LivePage = lazy(() => import('./pages/live/LivePage').then((m) => ({ default: m.LivePage })));\n\n// Localization — per-title subtitle / caption / dub track management\nconst LocalizationPage = lazy(() =>\n import('./pages/localization/LocalizationPage').then((m) => ({ default: m.LocalizationPage }))\n);\n\n// AI — concierge / recommendations assistant\nconst ConciergePage = lazy(() =>\n import('./pages/ai/ConciergePage').then((m) => ({ default: m.ConciergePage }))\n);\n\nconst PageLoader: FC = () => (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-b-2 border-action-primary-bg\" />\n </div>\n);\n\nconst FeatureDisabledFallback: FC = () => (\n <div className=\"flex min-h-[400px] flex-col items-center justify-center gap-2 px-6 text-center\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Coming soon</h2>\n <p className=\"max-w-sm text-sm text-text-secondary\">\n This feature is currently disabled for this workspace.\n </p>\n </div>\n);\n\n/**\n * Wrap a route element in a `FeatureGate` with the shared \"coming soon\"\n * fallback. `defaultValue={true}` keeps already-shipped screens visible\n * before their flag is seeded — seeding must never hide a working feature.\n */\nfunction gated(flag: string, element: ReactNode): ReactElement {\n return (\n <FeatureGate flag={flag} defaultValue={true} fallback={<FeatureDisabledFallback />}>\n {element}\n </FeatureGate>\n );\n}\n\nexport const HookMoviesRoutes: FC = () => {\n const { basePath, isStandalone } = useHookMovies();\n const location = useLocation();\n\n const normalizedBasePath = basePath === '/' ? '' : (basePath ?? '').replace(/\\/$/, '');\n\n if (normalizedBasePath && !isStandalone) {\n const pathMatches =\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + '/');\n\n if (!pathMatches) {\n return null;\n }\n }\n\n return (\n <div className=\"flex min-h-full flex-col\">\n <Suspense fallback={<PageLoader />}>\n <Routes>\n {/* Overview / dashboard */}\n <Route index element={<HomePage />} />\n\n {/* Catalog */}\n <Route path=\"catalog/titles\" element={<TitlesPage />} />\n <Route path=\"catalog/titles/new\" element={<TitleCreatePage />} />\n <Route path=\"catalog/titles/:id\" element={<TitleDetailPage />} />\n <Route path=\"catalog/studios\" element={<StudiosPage />} />\n <Route path=\"catalog/people\" element={<PeoplePage />} />\n\n {/* Productions */}\n <Route path=\"productions\" element={<ProductionsPage />} />\n <Route path=\"productions/new\" element={<ProductionCreatePage />} />\n <Route path=\"productions/:id\" element={<ProductionDetailPage />} />\n\n {/* Auditions */}\n <Route path=\"auditions\" element={<AuditionsPage />} />\n <Route path=\"auditions/new\" element={<AuditionCreatePage />} />\n <Route path=\"auditions/:id\" element={<AuditionDetailPage />} />\n <Route path=\"casting/mine\" element={<MyCastingPage />} />\n <Route path=\"casting/saved-searches\" element={<SavedSearchesPage />} />\n <Route path=\"casting/guardian-invite\" element={<GuardianInvitePage />} />\n\n {/* Engagement */}\n <Route path=\"engagement/reviews\" element={<ReviewsPage />} />\n\n {/* Distribution */}\n <Route path=\"distribution/rights\" element={<RightsWindowsPage />} />\n\n {/* Library */}\n <Route path=\"library/lists\" element={<ListsPage />} />\n <Route path=\"library/entitlements\" element={<EntitlementsPage />} />\n\n {/* Consumer (audience-facing) */}\n <Route path=\"browse\" element={<DiscoveryPage />} />\n <Route path=\"title/:id\" element={<TitleViewPage />} />\n <Route path=\"watch/:titleId\" element={<PlayerPage />} />\n <Route path=\"watch/:titleId/episode/:episodeId\" element={<PlayerPage />} />\n <Route path=\"hooks\" element={gated('hookmovies.hooks.enabled', <HooksPage />)} />\n\n {/* Social — profiles & watch parties */}\n <Route path=\"profiles\" element={<ProfilesPage />} />\n <Route path=\"watch-party\" element={<WatchPartyListPage />} />\n <Route path=\"watch-party/:id\" element={<WatchPartyRoomPage />} />\n\n {/* Commerce — checkout & payouts */}\n <Route path=\"checkout/:titleId\" element={<CheckoutPage />} />\n <Route path=\"payouts\" element={<PayoutsPage />} />\n\n {/* Analytics */}\n <Route path=\"analytics\" element={<AnalyticsPage />} />\n\n {/* Trust & safety */}\n <Route path=\"trust/moderation\" element={<ModerationPage />} />\n <Route path=\"trust/disputes\" element={<DisputesPage />} />\n <Route path=\"trust/verifications\" element={<VerificationsPage />} />\n\n {/* Onboarding */}\n <Route path=\"onboarding/languages\" element={<OnboardingPage />} />\n\n {/* Developer portal */}\n <Route path=\"developer\" element={<DevPortalPage />} />\n\n {/* Live — FAST channels */}\n <Route path=\"live\" element={gated('hookmovies.fast.enabled', <LivePage />)} />\n\n {/* Localization */}\n <Route path=\"title/:id/localization\" element={<LocalizationPage />} />\n\n {/* AI concierge */}\n <Route path=\"concierge\" element={gated('hookmovies.ai.concierge', <ConciergePage />)} />\n\n {/* Fallback */}\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { FC } from 'react';
2
+
3
+ export declare const EvidenceFiles: FC<{
4
+ fileIds: string[] | null | undefined;
5
+ }>;
6
+ //# sourceMappingURL=EvidenceFiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvidenceFiles.d.ts","sourceRoot":"","sources":["../../../src/hookmovies/components/EvidenceFiles.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AA4BhC,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAAA;CAAE,CAYtE,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { useFileUrl as e } from "../hooks/useFiles.js";
2
+ import { Paperclip as t } from "lucide-react";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ //#region src/hookmovies/components/EvidenceFiles.tsx
5
+ var i = ({ fileId: i, index: a }) => {
6
+ let o = e(i), s = `Evidence ${a + 1}`;
7
+ return o.isLoading ? /* @__PURE__ */ r("span", {
8
+ className: "text-xs text-text-secondary",
9
+ children: [s, "…"]
10
+ }) : o.data ? /* @__PURE__ */ r("a", {
11
+ href: o.data,
12
+ target: "_blank",
13
+ rel: "noopener noreferrer",
14
+ className: "inline-flex items-center gap-1 rounded-md border border-border-seam px-2 py-1 text-xs font-medium text-text-primary hover:bg-bg-sunken",
15
+ "data-testid": "dispute-evidence-link",
16
+ children: [/* @__PURE__ */ n(t, { className: "h-3 w-3" }), s]
17
+ }) : /* @__PURE__ */ r("span", {
18
+ className: "text-xs text-text-secondary",
19
+ children: [s, " (unavailable)"]
20
+ });
21
+ }, a = ({ fileIds: e }) => !e || e.length === 0 ? null : /* @__PURE__ */ r("div", {
22
+ className: "mt-3",
23
+ "data-testid": "dispute-evidence",
24
+ children: [/* @__PURE__ */ r("p", {
25
+ className: "mb-1.5 text-xs font-medium text-text-secondary",
26
+ children: [
27
+ "Evidence (",
28
+ e.length,
29
+ ")"
30
+ ]
31
+ }), /* @__PURE__ */ n("div", {
32
+ className: "flex flex-wrap gap-2",
33
+ children: e.map((e, t) => /* @__PURE__ */ n(i, {
34
+ fileId: e,
35
+ index: t
36
+ }, e))
37
+ })]
38
+ });
39
+ //#endregion
40
+ export { a as EvidenceFiles };
41
+
42
+ //# sourceMappingURL=EvidenceFiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvidenceFiles.js","names":[],"sources":["../../../src/hookmovies/components/EvidenceFiles.tsx"],"sourcesContent":["/**\n * Dispute evidence attachments (BOFF-9648)\n * @module hookmovies/components\n *\n * Renders the wspace-files-svc files attached to a casting dispute as\n * download links. Each link resolves its own short-lived presigned URL, so a\n * file the viewer may not read simply shows as unavailable.\n */\n\nimport type { FC } from 'react';\nimport { Paperclip } from 'lucide-react';\n\nimport { useFileUrl } from '../hooks/useFiles';\n\nconst EvidenceLink: FC<{ fileId: string; index: number }> = ({ fileId, index }) => {\n const url = useFileUrl(fileId);\n const label = `Evidence ${index + 1}`;\n if (url.isLoading) {\n return <span className=\"text-xs text-text-secondary\">{label}…</span>;\n }\n if (!url.data) {\n return <span className=\"text-xs text-text-secondary\">{label} (unavailable)</span>;\n }\n return (\n <a\n href={url.data}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 rounded-md border border-border-seam px-2 py-1 text-xs font-medium text-text-primary hover:bg-bg-sunken\"\n data-testid=\"dispute-evidence-link\"\n >\n <Paperclip className=\"h-3 w-3\" />\n {label}\n </a>\n );\n};\n\nexport const EvidenceFiles: FC<{ fileIds: string[] | null | undefined }> = ({ fileIds }) => {\n if (!fileIds || fileIds.length === 0) return null;\n return (\n <div className=\"mt-3\" data-testid=\"dispute-evidence\">\n <p className=\"mb-1.5 text-xs font-medium text-text-secondary\">Evidence ({fileIds.length})</p>\n <div className=\"flex flex-wrap gap-2\">\n {fileIds.map((id, index) => (\n <EvidenceLink key={id} fileId={id} index={index} />\n ))}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;AAcA,IAAM,KAAuD,EAAE,WAAQ,eAAY;CACjF,IAAM,IAAM,EAAW,EAAO,EACxB,IAAQ,YAAY,IAAQ;AAOlC,QANI,EAAI,YACC,kBAAC,QAAD;EAAM,WAAU;YAAhB,CAA+C,GAAM,IAAQ;MAEjE,EAAI,OAIP,kBAAC,KAAD;EACE,MAAM,EAAI;EACV,QAAO;EACP,KAAI;EACJ,WAAU;EACV,eAAY;YALd,CAOE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAChC,EACC;MAZG,kBAAC,QAAD;EAAM,WAAU;YAAhB,CAA+C,GAAM,iBAAqB;;GAgBxE,KAA+D,EAAE,iBACxE,CAAC,KAAW,EAAQ,WAAW,IAAU,OAE3C,kBAAC,OAAD;CAAK,WAAU;CAAO,eAAY;WAAlC,CACE,kBAAC,KAAD;EAAG,WAAU;YAAb;GAA8D;GAAW,EAAQ;GAAO;GAAK;KAC7F,kBAAC,OAAD;EAAK,WAAU;YACZ,EAAQ,KAAK,GAAI,MAChB,kBAAC,GAAD;GAAuB,QAAQ;GAAW;GAAS,EAAhC,EAAgC,CACnD;EACE,CAAA,CACF"}
@@ -0,0 +1,16 @@
1
+ import { FC } from 'react';
2
+ import { UploadedFile } from '../hooks/useFiles';
3
+
4
+ /** Per-file size cap for evidence (screenshots, PDFs, short clips). */
5
+ export declare const MAX_EVIDENCE_FILE_BYTES: number;
6
+ interface EvidenceUploaderProps {
7
+ id: string;
8
+ files: UploadedFile[];
9
+ onChange: (files: UploadedFile[]) => void;
10
+ maxFiles: number;
11
+ /** Lets the parent block submit while an upload is in flight. */
12
+ onUploadingChange?: (uploading: boolean) => void;
13
+ }
14
+ export declare const EvidenceUploader: FC<EvidenceUploaderProps>;
15
+ export {};
16
+ //# sourceMappingURL=EvidenceUploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvidenceUploader.d.ts","sourceRoot":"","sources":["../../../src/hookmovies/components/EvidenceUploader.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAoB,KAAK,EAAE,EAAoB,MAAM,OAAO,CAAC;AAGpE,OAAO,EAAgB,KAAK,YAAY,EAAqB,MAAM,mBAAmB,CAAC;AAEvF,uEAAuE;AACvE,eAAO,MAAM,uBAAuB,QAAmB,CAAC;AAExD,UAAU,qBAAqB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD;AAED,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAqGtD,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { FILE_FOLDERS as e, uploadFileToFiles as t } from "../hooks/useFiles.js";
2
+ import { useRef as n, useState as r } from "react";
3
+ import { Paperclip as i, Upload as a, X as o } from "lucide-react";
4
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
5
+ //#region src/hookmovies/components/EvidenceUploader.tsx
6
+ var l = 25 * 1024 * 1024, u = ({ id: u, files: d, onChange: f, maxFiles: p, onUploadingChange: m }) => {
7
+ let h = n(null), [g, _] = r(!1), [v, y] = r(null), b = p - d.length, x = (e) => {
8
+ _(e), m?.(e);
9
+ }, S = async (n) => {
10
+ let r = Array.from(n.target.files ?? []);
11
+ if (n.target.value = "", r.length === 0) return;
12
+ if (y(null), r.length > b) {
13
+ y(`You can attach at most ${p} files.`);
14
+ return;
15
+ }
16
+ let i = r.find((e) => e.size > l);
17
+ if (i) {
18
+ y(`"${i.name}" is larger than 25 MB.`);
19
+ return;
20
+ }
21
+ x(!0);
22
+ let a = [];
23
+ try {
24
+ for (let n of r) a.push(await t(n, e.disputeEvidence));
25
+ } catch (e) {
26
+ y(e instanceof Error ? e.message : "Upload failed. Please retry.");
27
+ } finally {
28
+ a.length > 0 && f([...d, ...a]), x(!1);
29
+ }
30
+ };
31
+ return /* @__PURE__ */ c("div", {
32
+ className: "space-y-2",
33
+ children: [
34
+ /* @__PURE__ */ s("input", {
35
+ ref: h,
36
+ id: u,
37
+ type: "file",
38
+ multiple: !0,
39
+ accept: "image/*,application/pdf,video/*,audio/*,.txt,.doc,.docx",
40
+ className: "sr-only",
41
+ onChange: (e) => void S(e),
42
+ "data-testid": "dispute-evidence-input"
43
+ }),
44
+ /* @__PURE__ */ c("button", {
45
+ type: "button",
46
+ onClick: () => h.current?.click(),
47
+ disabled: g || b <= 0,
48
+ className: "inline-flex items-center gap-2 rounded-lg border border-dashed border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary hover:bg-bg-sunken disabled:opacity-50 transition-colors",
49
+ children: [/* @__PURE__ */ s(a, { className: "h-4 w-4" }), g ? "Uploading…" : "Attach evidence"]
50
+ }),
51
+ /* @__PURE__ */ c("p", {
52
+ className: "text-xs text-text-secondary",
53
+ children: [
54
+ "Screenshots, payment receipts, messages or documents — up to ",
55
+ p,
56
+ " files, 25 MB each. Trust & safety reviews them alongside your statement."
57
+ ]
58
+ }),
59
+ v && /* @__PURE__ */ s("p", {
60
+ role: "alert",
61
+ className: "text-xs text-status-error-text",
62
+ children: v
63
+ }),
64
+ d.length > 0 && /* @__PURE__ */ s("ul", {
65
+ className: "space-y-1",
66
+ "data-testid": "dispute-evidence-list",
67
+ children: d.map((e) => /* @__PURE__ */ c("li", {
68
+ className: "flex items-center justify-between gap-2 rounded-md bg-bg-sunken px-2 py-1 text-xs text-text-primary",
69
+ children: [/* @__PURE__ */ c("span", {
70
+ className: "inline-flex min-w-0 items-center gap-1.5",
71
+ children: [/* @__PURE__ */ s(i, { className: "h-3 w-3 shrink-0" }), /* @__PURE__ */ s("span", {
72
+ className: "truncate",
73
+ children: e.name
74
+ })]
75
+ }), /* @__PURE__ */ s("button", {
76
+ type: "button",
77
+ onClick: () => f(d.filter((t) => t.id !== e.id)),
78
+ "aria-label": `Remove ${e.name}`,
79
+ className: "rounded p-0.5 text-text-secondary hover:text-text-primary",
80
+ children: /* @__PURE__ */ s(o, { className: "h-3 w-3" })
81
+ })]
82
+ }, e.id))
83
+ })
84
+ ]
85
+ });
86
+ };
87
+ //#endregion
88
+ export { u as EvidenceUploader };
89
+
90
+ //# sourceMappingURL=EvidenceUploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvidenceUploader.js","names":[],"sources":["../../../src/hookmovies/components/EvidenceUploader.tsx"],"sourcesContent":["/**\n * Evidence uploader for casting disputes (BOFF-9648)\n * @module hookmovies/components\n *\n * Uploads each chosen file to wspace-files-svc (the same presigned flow the\n * self-tape upload uses) and reports the resulting file ids to the parent\n * form, which sends them as `evidenceFileIds` when the dispute is raised.\n * HookMovies never stores the bytes itself.\n */\n\nimport { type ChangeEvent, type FC, useRef, useState } from 'react';\nimport { Paperclip, Upload, X } from 'lucide-react';\n\nimport { FILE_FOLDERS, type UploadedFile, uploadFileToFiles } from '../hooks/useFiles';\n\n/** Per-file size cap for evidence (screenshots, PDFs, short clips). */\nexport const MAX_EVIDENCE_FILE_BYTES = 25 * 1024 * 1024;\n\ninterface EvidenceUploaderProps {\n id: string;\n files: UploadedFile[];\n onChange: (files: UploadedFile[]) => void;\n maxFiles: number;\n /** Lets the parent block submit while an upload is in flight. */\n onUploadingChange?: (uploading: boolean) => void;\n}\n\nexport const EvidenceUploader: FC<EvidenceUploaderProps> = ({\n id,\n files,\n onChange,\n maxFiles,\n onUploadingChange,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [uploading, setUploading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const remaining = maxFiles - files.length;\n\n const setBusy = (busy: boolean) => {\n setUploading(busy);\n onUploadingChange?.(busy);\n };\n\n const handleChange = async (e: ChangeEvent<HTMLInputElement>) => {\n const chosen = Array.from(e.target.files ?? []);\n // Reset so choosing the same file again re-triggers change.\n e.target.value = '';\n if (chosen.length === 0) return;\n setError(null);\n if (chosen.length > remaining) {\n setError(`You can attach at most ${maxFiles} files.`);\n return;\n }\n const tooLarge = chosen.find((file) => file.size > MAX_EVIDENCE_FILE_BYTES);\n if (tooLarge) {\n setError(`\"${tooLarge.name}\" is larger than 25 MB.`);\n return;\n }\n setBusy(true);\n const uploaded: UploadedFile[] = [];\n try {\n for (const file of chosen) {\n uploaded.push(await uploadFileToFiles(file, FILE_FOLDERS.disputeEvidence));\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Upload failed. Please retry.');\n } finally {\n if (uploaded.length > 0) onChange([...files, ...uploaded]);\n setBusy(false);\n }\n };\n\n return (\n <div className=\"space-y-2\">\n <input\n ref={inputRef}\n id={id}\n type=\"file\"\n multiple\n accept=\"image/*,application/pdf,video/*,audio/*,.txt,.doc,.docx\"\n className=\"sr-only\"\n onChange={(e) => void handleChange(e)}\n data-testid=\"dispute-evidence-input\"\n />\n <button\n type=\"button\"\n onClick={() => inputRef.current?.click()}\n disabled={uploading || remaining <= 0}\n className=\"inline-flex items-center gap-2 rounded-lg border border-dashed border-border-seam px-3 py-1.5 text-sm font-medium text-text-primary hover:bg-bg-sunken disabled:opacity-50 transition-colors\"\n >\n <Upload className=\"h-4 w-4\" />\n {uploading ? 'Uploading…' : 'Attach evidence'}\n </button>\n <p className=\"text-xs text-text-secondary\">\n Screenshots, payment receipts, messages or documents — up to {maxFiles} files, 25 MB each.\n Trust &amp; safety reviews them alongside your statement.\n </p>\n {error && (\n <p role=\"alert\" className=\"text-xs text-status-error-text\">\n {error}\n </p>\n )}\n {files.length > 0 && (\n <ul className=\"space-y-1\" data-testid=\"dispute-evidence-list\">\n {files.map((file) => (\n <li\n key={file.id}\n className=\"flex items-center justify-between gap-2 rounded-md bg-bg-sunken px-2 py-1 text-xs text-text-primary\"\n >\n <span className=\"inline-flex min-w-0 items-center gap-1.5\">\n <Paperclip className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{file.name}</span>\n </span>\n <button\n type=\"button\"\n onClick={() => onChange(files.filter((f) => f.id !== file.id))}\n aria-label={`Remove ${file.name}`}\n className=\"rounded p-0.5 text-text-secondary hover:text-text-primary\"\n >\n <X className=\"h-3 w-3\" />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n};\n"],"mappings":";;;;;AAgBA,IAAa,IAA0B,KAAK,OAAO,MAWtC,KAA+C,EAC1D,OACA,UACA,aACA,aACA,2BACI;CACJ,IAAM,IAAW,EAAyB,KAAK,EACzC,CAAC,GAAW,KAAgB,EAAS,GAAM,EAC3C,CAAC,GAAO,KAAY,EAAwB,KAAK,EACjD,IAAY,IAAW,EAAM,QAE7B,KAAW,MAAkB;AAEjC,EADA,EAAa,EAAK,EAClB,IAAoB,EAAK;IAGrB,IAAe,OAAO,MAAqC;EAC/D,IAAM,IAAS,MAAM,KAAK,EAAE,OAAO,SAAS,EAAE,CAAC;AAG/C,MADA,EAAE,OAAO,QAAQ,IACb,EAAO,WAAW,EAAG;AAEzB,MADA,EAAS,KAAK,EACV,EAAO,SAAS,GAAW;AAC7B,KAAS,0BAA0B,EAAS,SAAS;AACrD;;EAEF,IAAM,IAAW,EAAO,MAAM,MAAS,EAAK,OAAO,EAAwB;AAC3E,MAAI,GAAU;AACZ,KAAS,IAAI,EAAS,KAAK,yBAAyB;AACpD;;AAEF,IAAQ,GAAK;EACb,IAAM,IAA2B,EAAE;AACnC,MAAI;AACF,QAAK,IAAM,KAAQ,EACjB,GAAS,KAAK,MAAM,EAAkB,GAAM,EAAa,gBAAgB,CAAC;WAErE,GAAK;AACZ,KAAS,aAAe,QAAQ,EAAI,UAAU,+BAA+B;YACrE;AAER,GADI,EAAS,SAAS,KAAG,EAAS,CAAC,GAAG,GAAO,GAAG,EAAS,CAAC,EAC1D,EAAQ,GAAM;;;AAIlB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,SAAD;IACE,KAAK;IACD;IACJ,MAAK;IACL,UAAA;IACA,QAAO;IACP,WAAU;IACV,WAAW,MAAM,KAAK,EAAa,EAAE;IACrC,eAAY;IACZ,CAAA;GACF,kBAAC,UAAD;IACE,MAAK;IACL,eAAe,EAAS,SAAS,OAAO;IACxC,UAAU,KAAa,KAAa;IACpC,WAAU;cAJZ,CAME,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAC7B,IAAY,eAAe,kBACrB;;GACT,kBAAC,KAAD;IAAG,WAAU;cAAb;KAA2C;KACqB;KAAS;KAErE;;GACH,KACC,kBAAC,KAAD;IAAG,MAAK;IAAQ,WAAU;cACvB;IACC,CAAA;GAEL,EAAM,SAAS,KACd,kBAAC,MAAD;IAAI,WAAU;IAAY,eAAY;cACnC,EAAM,KAAK,MACV,kBAAC,MAAD;KAEE,WAAU;eAFZ,CAIE,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD,EAAW,WAAU,oBAAqB,CAAA,EAC1C,kBAAC,QAAD;OAAM,WAAU;iBAAY,EAAK;OAAY,CAAA,CACxC;SACP,kBAAC,UAAD;MACE,MAAK;MACL,eAAe,EAAS,EAAM,QAAQ,MAAM,EAAE,OAAO,EAAK,GAAG,CAAC;MAC9D,cAAY,UAAU,EAAK;MAC3B,WAAU;gBAEV,kBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;MAClB,CAAA,CACN;OAfE,EAAK,GAeP,CACL;IACC,CAAA;GAEH"}
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBadge.d.ts","sourceRoot":"","sources":["../../../src/hookmovies/components/StatusBadge.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAGhC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4FD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAuB5C,CAAC"}
1
+ {"version":3,"file":"StatusBadge.d.ts","sourceRoot":"","sources":["../../../src/hookmovies/components/StatusBadge.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAGhC,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA6FD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAuB5C,CAAC"}
@@ -49,6 +49,7 @@ var r = {
49
49
  under_review: "warning",
50
50
  resolved: "success",
51
51
  dismissed: "outline",
52
+ verified: "success",
52
53
  inactive: "secondary",
53
54
  error: "destructive",
54
55
  failed: "destructive",
@@ -1 +1 @@
1
- {"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/hookmovies/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module hookmovies/components\n *\n * A colored badge based on status value with semantic color mapping\n * for various order, cart, and investment statuses.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface StatusBadgeProps {\n status: string;\n className?: string;\n}\n\ntype BadgeVariant = 'success' | 'warning' | 'destructive' | 'secondary' | 'info' | 'outline';\n\nconst variantStyles: Record<BadgeVariant, string> = {\n success: 'bg-status-success-bg-subtle text-status-success-text',\n warning: 'bg-status-warning-bg-subtle text-status-warning-text',\n destructive: 'bg-status-error-bg-subtle text-status-error-text',\n secondary: 'bg-bg-sunken text-text-secondary',\n info: 'bg-status-info-bg-subtle text-status-info-text',\n outline: 'border border-border-seam text-text-primary',\n};\n\n/** Statuses that represent a live/active state get an opacity-only glow pulse on their dot. */\nconst liveVariants: ReadonlySet<BadgeVariant> = new Set<BadgeVariant>(['success', 'info']);\n\nconst statusVariantMap: Record<string, BadgeVariant> = {\n // Title statuses\n draft: 'secondary',\n in_review: 'warning',\n scheduled: 'info',\n published: 'success',\n unpublished: 'outline',\n archived: 'outline',\n\n // Production statuses\n development: 'secondary',\n greenlit: 'info',\n in_production: 'warning',\n post_production: 'warning',\n released: 'success',\n shelved: 'destructive',\n\n // Audition statuses\n open: 'success',\n reviewing: 'warning',\n callbacks: 'info',\n closed: 'outline',\n cancelled: 'destructive',\n\n // Application statuses\n submitted: 'secondary',\n shortlisted: 'info',\n callback: 'info',\n offered: 'success',\n rejected: 'destructive',\n withdrawn: 'outline',\n\n // Review statuses\n pending: 'secondary',\n hidden: 'outline',\n removed: 'destructive',\n\n // Rights window / entitlement statuses\n active: 'success',\n expired: 'outline',\n revoked: 'destructive',\n\n // Casting trust layer (callbacks, offers, payment, disputes)\n proposed: 'warning',\n confirmed: 'success',\n declined: 'destructive',\n sent: 'warning',\n accepted: 'success',\n unpaid: 'secondary',\n marked_paid: 'info',\n receipt_confirmed: 'success',\n under_review: 'warning',\n resolved: 'success',\n dismissed: 'outline',\n\n // Generic\n inactive: 'secondary',\n error: 'destructive',\n failed: 'destructive',\n processing: 'warning',\n completed: 'success',\n};\n\nconst dotColor: Record<BadgeVariant, string> = {\n success: 'bg-status-success-text',\n warning: 'bg-status-warning-text',\n destructive: 'bg-status-error-text',\n secondary: 'bg-text-muted',\n info: 'bg-status-info-text',\n outline: 'bg-text-muted',\n};\n\nfunction formatStatusLabel(status: string): string {\n return status.replace(/_/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport const StatusBadge: FC<StatusBadgeProps> = ({ status, className }) => {\n const variant = statusVariantMap[status.toLowerCase()] || 'secondary';\n const isLive = liveVariants.has(variant);\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n variantStyles[variant],\n className\n )}\n >\n <span\n className={cn(\n 'size-1.5 rounded-full',\n dotColor[variant],\n isLive && 'motion-safe:animate-vc-glow-pulse'\n )}\n aria-hidden=\"true\"\n />\n {formatStatusLabel(status)}\n </span>\n );\n};\n"],"mappings":";;;AAkBA,IAAM,IAA8C;CAClD,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,MAAM;CACN,SAAS;CACV,EAGK,IAA0C,IAAI,IAAkB,CAAC,WAAW,OAAO,CAAC,EAEpF,IAAiD;CAErD,OAAO;CACP,WAAW;CACX,WAAW;CACX,WAAW;CACX,aAAa;CACb,UAAU;CAGV,aAAa;CACb,UAAU;CACV,eAAe;CACf,iBAAiB;CACjB,UAAU;CACV,SAAS;CAGT,MAAM;CACN,WAAW;CACX,WAAW;CACX,QAAQ;CACR,WAAW;CAGX,WAAW;CACX,aAAa;CACb,UAAU;CACV,SAAS;CACT,UAAU;CACV,WAAW;CAGX,SAAS;CACT,QAAQ;CACR,SAAS;CAGT,QAAQ;CACR,SAAS;CACT,SAAS;CAGT,UAAU;CACV,WAAW;CACX,UAAU;CACV,MAAM;CACN,UAAU;CACV,QAAQ;CACR,aAAa;CACb,mBAAmB;CACnB,cAAc;CACd,UAAU;CACV,WAAW;CAGX,UAAU;CACV,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,WAAW;CACZ,EAEK,IAAyC;CAC7C,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,MAAM;CACN,SAAS;CACV;AAED,SAAS,EAAkB,GAAwB;AACjD,QAAO,EAAO,QAAQ,MAAM,IAAI,CAAC,QAAQ,UAAU,MAAS,EAAK,aAAa,CAAC;;AAGjF,IAAa,KAAqC,EAAE,WAAQ,mBAAgB;CAC1E,IAAM,IAAU,EAAiB,EAAO,aAAa,KAAK,aACpD,IAAS,EAAa,IAAI,EAAQ;AAExC,QACE,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAc,IACd,EACD;YALH,CAOE,kBAAC,QAAD;GACE,WAAW,EACT,yBACA,EAAS,IACT,KAAU,oCACX;GACD,eAAY;GACZ,CAAA,EACD,EAAkB,EAAO,CACrB"}
1
+ {"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/hookmovies/components/StatusBadge.tsx"],"sourcesContent":["/**\n * Status Badge Component\n * @module hookmovies/components\n *\n * A colored badge based on status value with semantic color mapping\n * for various order, cart, and investment statuses.\n */\n\nimport type { FC } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface StatusBadgeProps {\n status: string;\n className?: string;\n}\n\ntype BadgeVariant = 'success' | 'warning' | 'destructive' | 'secondary' | 'info' | 'outline';\n\nconst variantStyles: Record<BadgeVariant, string> = {\n success: 'bg-status-success-bg-subtle text-status-success-text',\n warning: 'bg-status-warning-bg-subtle text-status-warning-text',\n destructive: 'bg-status-error-bg-subtle text-status-error-text',\n secondary: 'bg-bg-sunken text-text-secondary',\n info: 'bg-status-info-bg-subtle text-status-info-text',\n outline: 'border border-border-seam text-text-primary',\n};\n\n/** Statuses that represent a live/active state get an opacity-only glow pulse on their dot. */\nconst liveVariants: ReadonlySet<BadgeVariant> = new Set<BadgeVariant>(['success', 'info']);\n\nconst statusVariantMap: Record<string, BadgeVariant> = {\n // Title statuses\n draft: 'secondary',\n in_review: 'warning',\n scheduled: 'info',\n published: 'success',\n unpublished: 'outline',\n archived: 'outline',\n\n // Production statuses\n development: 'secondary',\n greenlit: 'info',\n in_production: 'warning',\n post_production: 'warning',\n released: 'success',\n shelved: 'destructive',\n\n // Audition statuses\n open: 'success',\n reviewing: 'warning',\n callbacks: 'info',\n closed: 'outline',\n cancelled: 'destructive',\n\n // Application statuses\n submitted: 'secondary',\n shortlisted: 'info',\n callback: 'info',\n offered: 'success',\n rejected: 'destructive',\n withdrawn: 'outline',\n\n // Review statuses\n pending: 'secondary',\n hidden: 'outline',\n removed: 'destructive',\n\n // Rights window / entitlement statuses\n active: 'success',\n expired: 'outline',\n revoked: 'destructive',\n\n // Casting trust layer (callbacks, offers, payment, disputes)\n proposed: 'warning',\n confirmed: 'success',\n declined: 'destructive',\n sent: 'warning',\n accepted: 'success',\n unpaid: 'secondary',\n marked_paid: 'info',\n receipt_confirmed: 'success',\n under_review: 'warning',\n resolved: 'success',\n dismissed: 'outline',\n verified: 'success',\n\n // Generic\n inactive: 'secondary',\n error: 'destructive',\n failed: 'destructive',\n processing: 'warning',\n completed: 'success',\n};\n\nconst dotColor: Record<BadgeVariant, string> = {\n success: 'bg-status-success-text',\n warning: 'bg-status-warning-text',\n destructive: 'bg-status-error-text',\n secondary: 'bg-text-muted',\n info: 'bg-status-info-text',\n outline: 'bg-text-muted',\n};\n\nfunction formatStatusLabel(status: string): string {\n return status.replace(/_/g, ' ').replace(/\\b\\w/g, (char) => char.toUpperCase());\n}\n\nexport const StatusBadge: FC<StatusBadgeProps> = ({ status, className }) => {\n const variant = statusVariantMap[status.toLowerCase()] || 'secondary';\n const isLive = liveVariants.has(variant);\n\n return (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium',\n variantStyles[variant],\n className\n )}\n >\n <span\n className={cn(\n 'size-1.5 rounded-full',\n dotColor[variant],\n isLive && 'motion-safe:animate-vc-glow-pulse'\n )}\n aria-hidden=\"true\"\n />\n {formatStatusLabel(status)}\n </span>\n );\n};\n"],"mappings":";;;AAkBA,IAAM,IAA8C;CAClD,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,MAAM;CACN,SAAS;CACV,EAGK,IAA0C,IAAI,IAAkB,CAAC,WAAW,OAAO,CAAC,EAEpF,IAAiD;CAErD,OAAO;CACP,WAAW;CACX,WAAW;CACX,WAAW;CACX,aAAa;CACb,UAAU;CAGV,aAAa;CACb,UAAU;CACV,eAAe;CACf,iBAAiB;CACjB,UAAU;CACV,SAAS;CAGT,MAAM;CACN,WAAW;CACX,WAAW;CACX,QAAQ;CACR,WAAW;CAGX,WAAW;CACX,aAAa;CACb,UAAU;CACV,SAAS;CACT,UAAU;CACV,WAAW;CAGX,SAAS;CACT,QAAQ;CACR,SAAS;CAGT,QAAQ;CACR,SAAS;CACT,SAAS;CAGT,UAAU;CACV,WAAW;CACX,UAAU;CACV,MAAM;CACN,UAAU;CACV,QAAQ;CACR,aAAa;CACb,mBAAmB;CACnB,cAAc;CACd,UAAU;CACV,WAAW;CACX,UAAU;CAGV,UAAU;CACV,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,WAAW;CACZ,EAEK,IAAyC;CAC7C,SAAS;CACT,SAAS;CACT,aAAa;CACb,WAAW;CACX,MAAM;CACN,SAAS;CACV;AAED,SAAS,EAAkB,GAAwB;AACjD,QAAO,EAAO,QAAQ,MAAM,IAAI,CAAC,QAAQ,UAAU,MAAS,EAAK,aAAa,CAAC;;AAGjF,IAAa,KAAqC,EAAE,WAAQ,mBAAgB;CAC1E,IAAM,IAAU,EAAiB,EAAO,aAAa,KAAK,aACpD,IAAS,EAAa,IAAI,EAAQ;AAExC,QACE,kBAAC,QAAD;EACE,WAAW,EACT,mFACA,EAAc,IACd,EACD;YALH,CAOE,kBAAC,QAAD;GACE,WAAW,EACT,yBACA,EAAS,IACT,KAAU,oCACX;GACD,eAAY;GACZ,CAAA,EACD,EAAkB,EAAO,CACrB"}